コックのパス誘導のアナログはmatch
構造です。 HoTTの本で説明したように、パス誘導を定義するためにこの方法を使用する方法があります。
Set Implicit Arguments.
Definition J {A} {x : A} (P : forall y, x = y -> Type)
(H : P x eq_refl) : forall y p, P y p :=
fun y p => match p with eq_refl => H end.
この定義のタイプは、我々が
y : A
、
p : x = y
、および
P : forall y, x = y -> Type
は、
それで十分P y p
を、証明したい時はいつでも、と述べていますそのことを示すためにP x eq_refl
が成立する。 J
を使用して、g
関数が定数であることを示すことができます。 (私はCoqの標準ライブラリによって与えられたものと一致する定義を言い換えています。)
Definition f (s : unit) : tt = tt := match s with tt => eq_refl end.
Definition g (p : tt = tt) : unit := match p return unit with eq_refl => tt end.
Definition g_tt p : g p = tt :=
J (fun y q => match q return unit with eq_refl => tt end = tt)
eq_refl p.
この証明のトリッキーな部分は、他のケースである、J
のP
パラメータがどうあるべきかを見つけ出すれますパス誘導によって進行する証明。ここでは、私は上記の使用q
がtt = y
型を持つのに対し、それは、タイプtt = tt
の引数を必要とするため、g
の定義を展開しなければなりませんでした。いずれにしても、P tt p
は定義上はg p = tt
に等しいことがわかります。これは私たちが証明したいものです。
p : tt = tt
については、p = eq_refl
を表示するようにトリックを行うことができます。以前の結果と組み合わせることで、あなたが望むものを正確に与えることができます。
Definition result (p : tt = tt) : p = eq_refl :=
J (fun y q =>
unit_rect (fun z => tt = z -> Prop)
(fun u => u = eq_refl)
y q)
eq_refl p.
また、要点はP
パラメータです。我々は、我々がT tt
の要素を見つけることができる時はいつでも(T : unit -> Type
とx : tt
用)タイプT x
の何かを定義することができると言うunit
のための誘導原理を利用します。J
のこの適用の結果は、この場合にunit_rect
ための計算規則によってだけ
unit_rect (fun z => tt = z -> Prop)
(fun u => u = eq_refl)
tt p
= (p = eq_refl)
あるタイプ
P tt p
を有するべきであることを想起されたいです。
残念なことに、この種の証明はCoqの戦術的言語で複製するのが難しいです。なぜなら、しばしばP
の内容を推測することが困難なためです。この値があなた自身であるべきものを理解し、証明用語を明示的に書き留めるほうが簡単です。
私は理由をよく理解していませんが、match
と校正用語を書き留めた場合、この注釈を理解する上でCoqも非常に優れています。比較:
Definition result' (p : tt = tt) : p = eq_refl :=
match p with eq_refl => eq_refl end.
を、これは非常に簡単に見えますが、あなたはそれを印刷しようとすると、コックによって推測実際の用語ははるかに複雑であることがわかります。それを試してみてください!
編集
ああ、私はちょうどあなたがコックの格好いいバージョンを使用しようとしていたことに気づきました。私はそのバージョンがインストールされていないが、私はそれに私のソリューションを適応させることはあまり難しいとは思わないと思う。
次回は、コードに[完全な、最小限の例がある](https://stackoverflow.com/help/mcve)があれば役に立ちます。 –
@ArthurAzevedoDeAmorim HoTTインポートがありません。一定。 –