Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
证明两个绑定在名义Isabelle中相等_Isabelle - Fatal编程技术网

证明两个绑定在名义Isabelle中相等

证明两个绑定在名义Isabelle中相等,isabelle,Isabelle,考虑以下数据类型,这些数据类型在Nominal Isabelle中具有绑定: theory Example imports "Nominal2.Nominal2" begin atom_decl vrs nominal_datatype ty = Tvar "vrs" | Arrow x::vrs T::"ty" binds x in T nominal_datatype trm = Var

考虑以下数据类型,这些数据类型在Nominal Isabelle中具有绑定:

theory Example
  imports "Nominal2.Nominal2" 
begin

atom_decl vrs

nominal_datatype ty = 
    Tvar   "vrs"
  | Arrow x::vrs T::"ty" binds x in T

nominal_datatype trm = 
    Var   "vrs"
  | Abs   x::"vrs" t::"trm"  binds x in t 

inductive
  typing :: "trm ⇒ ty ⇒ bool" ("_ , _" [60,60] 60) 
where
 T_Abs[intro]: "(Abs x t) , (Arrow x T)"

equivariance typing
nominal_inductive typing done 

lemma 
  assumes "(Abs x t), (Arrow y T)"
  shows "x = y"
  using assms 
我想证明关系中出现的两个绑定是相等的。我认为Isabelle用户可以通过两种方式提供帮助:

  • 如果你认识伊莎贝尔,有可能这样做吗
  • 否则,对于助手来说,规则T_Abs中出现的两个x是相等的,还是具有不同身份的绑定变量
  • 如果你认识伊莎贝尔,有可能这样做吗
  • 不幸的是,不可能证明你试图证明的定理。下面是一个反例(证据是
    Sledgehammer
    ed):

  • 否则,规则T_Abs中出现的两个x是否等于 助手或者它们是一种不同类型的绑定变量 身份

  • 我相信你的思路是正确的,希望上面的例子能澄清你可能遇到的任何困惑。通常,您可以将
    Abs x t1=Abs y t2
    的含义解释为
    (λx.t1)
    (λy.t2)
    的α等价物。当然,
    (λx.t1)
    (λy.t2)
    可能是α等价的,而
    x
    y
    是相等的。

    我试图证明空白。然而,很难找到Abs或Repr的定理,因为我不知道它们代表什么特征,商类型?我认为命名Abs_vrs使我无法找到与之相关的实际定理。@Rodrigo所说的“试图证明”,你指的是任何证明还是规范证明?正如我在回答中提到的,
    Sledgehammer
    在这两种情况下都提供了可接受的证据(我用
    Sledgehammer
    的证据更新了我的回答)。Nominal的基础结构是基于商类型构建的。通过使用
    查找定理“Abs\u vrs”
    ,您可以看到涉及常数Abs\u vrs的定理。不要忘记,在调用
    nominal\u数据类型
    后,您还可以立即键入
    print\u定理
    。如果您还有其他问题,请告诉我,但请记住,我可能无法立即答复。
    theory Scratch
      imports "Nominal2.Nominal2" 
    begin
    
    atom_decl vrs
    
    nominal_datatype ty = 
        Tvar   "vrs"
        | Arrow x::vrs T::"ty" binds x in T
    
    nominal_datatype trm = 
        Var   "vrs"
        | Abs   x::"vrs" t::"trm"  binds x in t 
    
    inductive
      typing :: "trm ⇒ ty ⇒ bool" ("_ , _" [60,60] 60) 
    where
     T_Abs[intro]: "(Abs x t) , (Arrow x T)"
    
    equivariance typing
    nominal_inductive typing . 
    
    abbreviation s where "s ≡ Sort ''Scratch.vrs'' []"
    abbreviation v where "v n ≡ Abs_vrs (Atom s n)"
    
    lemma neq: "Abs (v 1) (Var (v 0)), Arrow (v (Suc (Suc 0))) (Tvar (v 0))"
      (is "?a, ?b")
    proof-
      have a_def: "Abs (v 1) (Var (v 0)) = Abs (v (Suc (Suc 0))) (Var (v 0))"
        (*Sledgehammered*)
        by simp (smt Abs_vrs_inverse atom.inject flip_at_base_simps(3) fresh_PairD(2) 
            fresh_at_base(2) mem_Collect_eq nat.distinct(1) sort_of.simps trm.fresh(1))
      from typing.simps[of ?a ?b, unfolded this, THEN iffD2] have
        "Abs (v (Suc (Suc 0))) (Var (v 0)) , Arrow (v (Suc (Suc 0))) (Tvar (v 0))"
        by auto
      then show ?thesis unfolding a_def by clarsimp
    qed
    
    lemma "∃x y t T. x ≠ y ∧ (Abs x t), (Arrow y T)"
    proof(intro exI conjI)
      show "v 1 ≠ v (Suc (Suc 0))" 
        (*Sledgehammered*)
        by (smt Abs_vrs_inverse One_nat_def atom.inject mem_Collect_eq n_not_Suc_n 
            sort_of.simps)
      show "Abs (v 1) (Var (v 0)) , Arrow (v (Suc (Suc 0))) (Tvar (v 0))"
        by (rule neq)
    qed
    
    end