Isabelle/HOL で自己定義add関数の可換性を証明しようとしています。私は結合性を証明することができましたが、私はこれにこだわっています。
の定義add:
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)
編集:私は正しい方向へのプッシュとして、答えを探しているわけではありません。これらは Concrete Sementics という本からの演習です。