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)