Isabelle 伊莎贝尔的双重功能
我试图通过教程学习Isabelle/HOL。我对双重功能的练习有问题。我是这样定义的:Isabelle 伊莎贝尔的双重功能,isabelle,Isabelle,我试图通过教程学习Isabelle/HOL。我对双重功能的练习有问题。我是这样定义的: fun double :: "nat ⇒ nat" where "double 0 = add 0 0" | "double (Suc m) = Suc(Suc (double m))" 但在我的定理中,当试图证明double m=加法m时: theorem add_d [simp] : "double x = add x x" apply(induction x) apply(auto) done 应
fun double :: "nat ⇒ nat" where
"double 0 = add 0 0" |
"double (Suc m) = Suc(Suc (double m))"
但在我的定理中,当试图证明double m=加法m时:
theorem add_d [simp] : "double x = add x x"
apply(induction x)
apply(auto)
done
应用(自动)永远不会被计算(它的背景是粉红色(?)。同样的练习要求证明add的交换性和结合性,这很有效。我将Isabelle2014与默认(Jedit)IDE一起使用。在您的注释中的代码中,许多定理都具有
[simp]
属性,告诉Isabelle将它们添加到simpset中。但是,其中一些不适合作为重写规则(由simp
和auto
使用),因为它们导致一个术语,可以再次应用相同的规则,从而导致无限循环。从simpset中删除有问题的定理可以实现以下目的:
theorem add_d: "double x = add x x"
apply (induction x)
apply (auto simp del: add_zero)
done
但更好的解决方案是首先避免将此类定理添加到simpset,例如从其声明中删除[simp]
属性:
lemma add_zero: "add x 0 = add 0 x"
apply (induction x)
apply (auto)
done
之后,add\u d
不需要simp del
部分。但可能需要明确告知其他一些定理才能使用此特定规则,例如:
theorem add_com: "add x y = add y x"
apply (induction x)
apply (auto simp add: add_zero)
done
请注意,与您的代码相比,
[simp]
属性再次被删除,以避免在其他地方使用add\u com
时循环重写。虽然Alexander关于simp规则的建议是合理的,但让我给出一些进一步的评论
首先,在您对double
的定义中,我将用0
替换add0
。一般建议:与复杂表达式相比,更喜欢简单表达式
其次,Isabelle的简化器实际上“足够聪明”,可以在不循环的情况下处理AC重写(即结合性和交换性),即两个引理
lemma add_assoc [simp]:
"add (add x y) z = add x (add y z)"
及
与simp规则一样好(即,您可以保留[simp]
属性)。你正在经历的循环的原因是你的引理
(*BAD*)
lemma add_zero [simp]:
"add x 0 = add 0 x"
由于simpset中有它(Isabelle行话,指的是simp
和auto
等方法使用的所有简化规则集),因此允许无限派生:
add 0 0 = add 0 0 = add 0 0 = ...
我建议用
lemma add_zero [simp]:
"add x 0 = x"
那么你所有的证明(只要它们以正确的顺序陈述)都应该是“自动”的
apply (induction ...)
apply auto
done
可以缩写为
by (induction ...) (auto)
我无法在伊莎贝尔的领导下重现这种行为。你能试着给出一个最小的完整示例,即一个完整的理论文件,其中只包含错误吗?下面是一个示例。问题在第31行,现在它工作了(将add2保留在simp类中)。似乎事实上我有一个无限循环。
by (induction ...) (auto)