Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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,我试图通过教程学习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 应

我试图通过教程学习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

应用(自动)永远不会被计算(它的背景是粉红色(?)。同样的练习要求证明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)