Isabelle 伊莎贝尔中的非常简单引理
我刚刚开始我与伊莎贝尔的第一步,但是,作为定理证明者和证明助手的新手,我有点迷路了。我主要对函数分析或代数的应用程序感兴趣。我查看了文档,并尝试使用区域设置来获得我自己的示例,但我遇到了一些非常基本的问题。我的代码是Isabelle 伊莎贝尔中的非常简单引理,isabelle,Isabelle,我刚刚开始我与伊莎贝尔的第一步,但是,作为定理证明者和证明助手的新手,我有点迷路了。我主要对函数分析或代数的应用程序感兴趣。我查看了文档,并尝试使用区域设置来获得我自己的示例,但我遇到了一些非常基本的问题。我的代码是 theory MyTheory imports Main begin locale semigroup_mult = fixes f :: "'a ⇒ 'a ⇒ 'a" (infixl "x" 70) and e :: 'a ("e") assumes assoc
theory MyTheory
imports Main
begin
locale semigroup_mult =
fixes f :: "'a ⇒ 'a ⇒ 'a" (infixl "x" 70)
and e :: 'a ("e")
assumes assocm : "a x b x c = a x (b x c)"
and right_neutralm : "(a x e) = a"
and left_neutralm : "(e x a) = a"
begin
lemma assoc_general: "b x (a x c) = (b x a) x c"
apply (rule assocm)
done
end
end
这只是一个证明,但我不能让伊莎贝尔工作。。。如果我删除apply行,它会说它无法完成证明,apply命令会给出错误
在“证明”模式下非法使用证明命令
我做错了什么?任何帮助都将不胜感激。例如,使用“show…by”语法和“apply”语法、“proof…qed”和“done”之间的区别
第二个问题是,Isabelle是否有可能输出类似于本科数学教科书的证明。当我与Isabelle/jEdit(Isabelle 2016)一起尝试您的代码时,我收到了错误消息 未能应用证明方法⌂:
目标(1个子目标):
1.b x(a x c)=b x a x c 这说明无法将给定规则(
assocm
)应用于当前子目标。原因是规则
试图将assocm
的结论(这是整个引理)与当前子目标统一起来。如果成功,它将用你应用的引理的假设替换当前的子目标,但在你的例子中它没有成功
有两种方法:
1) 你可以用交换的左手边和右手边来重述引理。那么您当前的证明就可以工作了(很简单,因为它与assocm
相同)
2) 或者,如果您真的只想“用相等替换相等”,则不应使用规则
,而应使用simp
或自动
。例如
apply (simp add: assocm)
或者分两步进行
unfolding assocm
by (rule HOL.refl)
它首先用它的右边代替了assocm的左边,最后用等式的自反性来证明
回答你的第二个问题:不可能自动将一些武断的证据转换成类似于本科生教科书的东西。然而,如果有足够的努力和适当的自动工具设置,如simp
、blast
、和auto
,那么以这种风格(在Isar语法的范围内)编写校样是完全可能的。例如,以下示例显示了一些Isar功能,这些功能使证明更易于人类阅读:
lemma "(b x e) x e x (a x c) = b x a x c"
proof -
have "b x e = b" by (rule right_neutralm)
then have "(b x e) x e x (a x c) = b x (a x c)" by simp
also have "... = b x a x c" by (rule assocm [symmetric])
finally show ?thesis .
qed
但是,更常见的是使用自动校对,如:
lemma "(b x e) x e x (a x c) = b x a x c"
by (simp add: right_neutralm assocm)