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]”属性手动添加。重写是有方向的,总是从左到右,所以右手边应该比左手边“简单”,并且应该避免循环。我在回答中添加了更多细节。