Coq と TopProver

TopProver

問37 Zero test

https://top-prover.top/problem/37

Inductive iszero : nat -> Prop :=
| iszero_0 : iszero 0
| iszero_S : forall n, iszero (S n) -> iszero n.

Definition task := forall n, iszero n <-> n = 0.

まだcoqに慣れないので翻訳すると、

  • Inductive iszero 帰納法を定義したクラス、自然数natによって述語「iszero n」がインデックスされている
  • iszero_0 述語「iszero 0」の根拠となるコンストラク
  • iszero_S 述語「iszero n」の根拠は「iszero (S n)」であることを示すコンストラク

名前から察せられるがこのデータ型(集合)には iszero 0 しか存在しない、つまり iszero 0 しか証明できない。iszero 1の証明にはiszero 2が必要で、iszero 3, 4....が必要になる。この定義合法なのか。
右向き iszero n -> n=0 を示す。Inductive の型なのでとりあえず iszero nでinduction してみると、ベースケース iszero_0 は0=0で自明。帰納ステップは

1 subgoal
n : nat
H : iszero (S n)
IHiszero : S n = 0
______________________________________(1/1)
n = 0

なぜか S n = 0 が得られる。なんだこれ。前提が矛盾しているので証明可能。
左向き iszero n <- n=0 はコンストラクタそのもので自明。解 https://top-prover.top/submission/1219

問39 Boolean-hole principle revisited

https://top-prover.top/problem/39

Definition task :=
  (forall P Q R, (P <-> Q) \/ (Q <-> R) \/ (R <-> P))
  -> forall P, P \/ ~ P.

Boolean-Holeを検索してもよくわからないけど鳩ノ巣原理のパロディ?時間内に解けなかったけど簡単だった。

~ P は P -> False と等価なので前提にPとFalseを入れたくなる。他に使える述語と言えば True しかない。
https://top-prover.top/submission/1244