Logic isabelle证明加法的交换性
我试图证明一个自定义的Logic isabelle证明加法的交换性,logic,proof,isabelle,commutativity,Logic,Proof,Isabelle,Commutativity,我试图证明一个自定义的add函数在Isabelle/HOL中的可交换性。我设法证明了关联性,但我被困在这一点上了 添加的定义如下: fun add :: "nat ⇒ nat ⇒ nat" where "add 0 n = n" | "add (Suc m) n = Suc(add m n)" 结合性的证明: lemma add_Associative: "add(add k m) z = add k (add m z)" apply(induction k) apply(auto) done
add
函数在Isabelle/HOL中的可交换性。我设法证明了关联性,但我被困在这一点上了
添加的定义如下:
fun add :: "nat ⇒ nat ⇒ nat" where
"add 0 n = n" |
"add (Suc m) n = Suc(add m n)"
结合性的证明:
lemma add_Associative: "add(add k m) z = add k (add m z)"
apply(induction k)
apply(auto)
done
交换性的证明:
theorem add_commutativity: "add k m = add m k"
apply(induction k)
apply(induction m)
apply(auto)
我有以下目标:
goal (3 subgoals):
1. add 0 0 = add 0 0
2. ⋀m. add 0 m = add m 0 ⟹
add 0 (Suc m) = add (Suc m) 0
3. ⋀k. add k m = add m k ⟹
add (Suc k) m = add m (Suc k)
应用auto后,我只剩下子目标3:
3. ⋀k. add k m = add m k ⟹
add (Suc k) m = add m (Suc k)
编辑:与其说我在寻找答案,不如说我在向正确的方向努力。这些是一本名为《混凝土力学》的书中的练习。我建议将证明尽可能模块化(即,证明中间引理,这将有助于解决交换性证明)。为此,在应用完全自动化(如您的apply(auto)
)之前,思考induct
引入的子目标通常会提供更多信息
此时,子目标是:
goal (2 subgoals):
1. add 0 m = add m 0
2. ⋀k. add k m = add m k ⟹ add (Suc k) m = add m (Suc k)
让我们分开来看
使用add
的定义,我们只能简化左侧,
i、 例如,添加0 m=m
。然后问题仍然是如何证明addm0=m
。
你这样做是作为你主要证据的一部分。我认为它会增加
证明下列独立引理的可读性
lemma add_0 [simp]:
"add m 0 = m"
by (induct m) simp_all
并使用[simp]
将其添加到自动化工具中(如simp
和auto
)。此时
第一个子目标可以通过simp
求解,只剩下第二个子目标
在应用add
的定义以及归纳假设(add km=add mk
)之后,我们必须证明Suc(add mk)=add m(Suc k)
。这看起来非常类似于add
原始定义中的第二个等式,只是使用了交换的参数。(从这个角度来看,我们必须证明的第一个子目标对应于具有交换参数的add
定义中的第一个方程。)现在,我建议尝试证明一般引理add m(Suc n)=Suc(add m n)
,以便继续
我在评论chris的回答时回答了RainyCats的问题:
“伊莎贝尔如何证明”。我给出了在Isar中手动和逐步添加add
的关联性的详细证明
通过k上的归纳手动关联:
- 对于
k
=0
我们必须证明add(add 0 m)z=add 0(add m z)
我们用添加的定义重写:
fun add :: "nat ⇒ nat ⇒ nat" where
"add 0 n = n" |
"add (Suc m) n = Suc(add m n)"
add(add0 m)z
⇢ <代码>添加m z
add0(addmz)
⇢ <代码>添加m z
然后,目标通过=
的自反性得到证明
k
=Suc k'
- 我们假设
add(addk'm)z=addk'(addmz)
- 我们必须证明
add(add(Suc k')m)z=add(Suc k')(add m z)
添加的定义重写:
fun add :: "nat ⇒ nat ⇒ nat" where
"add 0 n = n" |
"add (Suc m) n = Suc(add m n)"
add(add(Suc k')m)z
⇢ <代码>添加(Suc(add k'm))z
⇢ <代码>Suc(添加(添加k'm)z)add(Suc k')(add m z)
⇢ <代码>Suc(添加k'(添加mz))Suc(add(add k'm)z)
⇢ <代码>Suc(添加k'(添加mz))
然后通过=
的自反性证明目标
在具有这种详细程度的会计准则专家组中,这将给出:
lemma add_Associative: "add(add k m) z = add k (add m z)"
proof (induction k)
case 0
have "add (add 0 m) z = add m z" by (subst add.simps, intro refl)
moreover have "add 0 (add m z) = add m z" by (subst add.simps, intro refl)
ultimately show ?case by (elim ssubst, intro refl)
next
case (Suc k')
have "add (add (Suc k') m) z = add (Suc (add k' m)) z" by (subst add.simps, intro refl)
also have "… = Suc (add (add k' m) z)" by (subst add.simps, intro refl)
also have "… = Suc (add k' (add m z))" by (subst Suc, intro refl)
moreover have "add (Suc k') (add m z) = Suc (add k' (add m z))" by (subst add.simps, intro refl)
ultimately show ?case by (elim ssubst, intro refl)
qed
在这里,我已经尽了可能小的步骤,所有的
by…
都可以被by simp
取代,谢谢你的帮助!只是个问题,我想我真的不明白伊莎贝尔是怎么证明的。我知道归纳假说是如何工作的,但如果你让我手动证明这一点,我就无法做到。有没有学习这门数学的好资源(书籍/在线课程)?如果你理解归纳法,剩下的部分将由简化器求解,简化器根据所谓的simpset中包含的等式引理重写术语。引理通过“primrec”和“fun”(定义的方程式)添加到simpset中,并通过“[simp]”属性手动添加。重写是有方向的,总是从左到右,所以右手边应该比左手边“简单”,并且应该避免循环。我在回答中添加了更多细节。