Coqメモ


CoqのPropについて、メモします。

簡単なSet

Coq.Init.Datatypesに定義されている。

Inductive Empty_set : Set :=.
Inductive unit : Set :=
    tt : unit.
Inductive bool : Set :=
  | true : bool
  | false : bool.

簡単なProp

Coq.Init.Logicで定義されている

Inductive True : Prop :=
  I : True.
Inductive False : Prop :=.

簡単なSetと簡単なPropの間の対応

boolに対応するものは、Propには用意されていない?

boolに対応するSetを無理やり作る。

Inductive X:Prop := A|B.

対応を表にすると以下のようになる。

Set Prop
Empty_set : Set False : Prop
unit : Set True : Prop
tt : unit I : True
bool : Set X : Prop
true : bool A : X
false : bool B : X

unitのmatchによる分解

以下はエラーにならない。

Check ( fun x :bool => match x with
| true => Set
| false => Prop
end).

Check ( fun x :bool => match x with
| true => True
| false => False
end
).

Check ( fun x :bool => match x with
| true => A
| false => B
end
).

Xのmatchによる分解

以下はエラーになる。

(* X -> Typeを作ろうとした *)
Check ( fun x :X => match x with
| A => Set
| B => Prop
end).

(* X -> Propを作ろうとした*)
Check ( fun x :X => match x with
| A => True
| B => False
end).

(* X -> Setを作ろうとした*)
Check ( fun x :X => match x with
| A => unit
| B => Empty_set
end
).

(* X -> boolを作ろうとした*)
Check ( fun x :X => match x with
| A => true
| B => false
end
).

以下はエラーにならない。

Check ( fun x :X => match x with
| A => A
| B => B
end
).

Check ( fun x :X => match x with
| A => I
| B => I
end
).

Check ( fun x :X => match x with
| _ => true
end
).

排中律(forall P:Prop, P \/ ~ P)があるとproof irrelevance(forall (P:Prop) (p1 p2:P), p1 = p2)が証明できるらしく、matchでXを分解し、証明以外のものにできてしまったら大変である。