章一覧

等式を証明する

等式の命題、反射律、矛盾を使います。

14.1 a = b は値が等しいことの証拠

ch14-refl.taut
import std::Base

theorem two_plus_two(): (2: Nat) + 2 = 4 {
  Refl
}
✓ 検査を通過
✓ theorem two_plus_two : 2 + 2 = 4

a = b は、型 Nat の二つの項が等しいという命題です。Refl は反射律、つまり「同じものは同じものに等しい」を与えます。2 + 2 と 4 は、計算によって同じ形に簡約できるので、カーネルはこの証明を受け取れます。

== と a = b を混同しないでください。== は実行時に使う等価比較で、a = b は証明の世界で扱う命題です。

間違った命題は、通りません。

ch14-wrong.taut
import std::Base

theorem wrong(): (2: Nat) + 2 = 5 {
  Refl
}
✗ エラー
✗ wrong

error 4:3: type mismatch: expected `2 + 2 = 5`, found `2 + 2 = 2 + 2`
  differing part: expected `5`, found `4`

コードの下には、使用中の CLI が返した実際の型エラーを表示します。

Refl は (4: Nat) = 4 の証明であって、2 + 2 = 5 の証明ではない、という指摘です。Refl が証明できるのは、「計算した結果が一致する」ことだけです。

14.2 等式をつなぐ

道具意味
Refla = a を示す
Eq::sym(e)a = b から b = a
Eq::trans(e1, e2)a = b, b = c から a = c
Eq::congr(f, e)a = b なら f(a) = f(b)
Eq::subst(...)等しいものを置き換える

Refl の型や等式の項は、証明すべき命題から決まります。証明中では Refl と書きます。

ch14-tools.taut
import std::Base

theorem sym_ex(a: Nat, b: Nat, e: a = b): b = a {
  Eq::sym(e)
}

theorem trans_ex(
  a: Nat,
  b: Nat,
  c: Nat,
  e1: a = b,
  e2: b = c
): a = c {
  Eq::trans(e1, e2)
}

theorem congr_ex(a: Nat, b: Nat, e: a = b): Succ(a) = Succ(b) {
  Eq::congr(Succ, e)
}
✓ 検査を通過
✓ theorem sym_ex : ∀ a: Nat. ∀ b: Nat. (a = b) -> b = a
✓ theorem trans_ex : ∀ a: Nat. ∀ b: Nat. ∀ c: Nat. (a = b) -> (b = c) -> a = c
✓ theorem congr_ex : ∀ a: Nat. ∀ b: Nat. (a = b) -> Succ(a) = Succ(b)

14.3 間違った等式を仮定したら

ch14-absurd.taut
import std::Base

theorem two_plus_two_ne_five(h: (2: Nat) + 2 = 5): False {
  match h: False {
  }
}
✓ 検査を通過
✓ theorem two_plus_two_ne_five : ¬(2 + 2 = 5)

この定理は、「もし 2 + 2 = 5 の証拠があるなら、矛盾に到達する」と主張します。2 + 2 は 4 になるので、(4: Nat) = 5 は、Refl のどの形とも一致しません。腕が空の match は、あり得る構成子が一つもないことを表しています。

14.4 公理を足すことの意味

公理 axiom を宣言すると、証明されていない仮定を採用できます。これ自体が、常に不正という意味ではありません。たとえば排中律は、次のように公理として足せます。

ch14-axiom.taut
import std::Base

axiom em(P: Prop): P ∨ ¬P

theorem not_not(P: Prop, n: ¬¬P): P {
  Or::elim(em(P), p => p, np => False::elim(n(np)))
}
✓ 検査を通過
✓ axiom em : ∀ P: Prop. Or(P, ¬P)
✓ theorem not_not : ∀ P: Prop. (¬(¬P)) -> P
ok      em (axioms: em)
ok      not_not (axioms: em)

出力にも、not_not が公理 em に依存していることが表示されます。公理を使った定理は、公理に依存した結果です。証明済みであることと、公理なしで成り立つことは、区別してください。

演習 14.1:theorem reflexive(x: Nat): x = x を完成させてください。