短い回答:できません。
私たちも同じようなことを証明するために失敗した場合、のは、単純な例を見てみましょう:
Error: Not a discriminable equality.
さあ、試してみて、見つけるてみましょう:
Inductive baz : Prop :=
| baz1 : baz
| baz2 : baz.
Goal baz1 <> baz2.
intro H.
Fail discriminate H.
Abort.
上記は、次のエラーメッセージで失敗します正確にはdiscriminate
が失敗します。
すべての最初に、回り道をして、非常に簡単な文を証明してみましょう:
Goal false <> true.
intro prf; discriminate.
Qed.
我々はまた、代わりに戦術を使用して、それを構築するのではなく、直接その証拠用語を提供することにより、上記の目的を証明することができます。
Goal false <> true.
exact (fun prf : false = true =>
eq_ind false (fun e : bool => if e then False else True) I true prf).
Qed.
上記は、discriminate
の戦術が単純化したものです。
のは、それに対応しfalse
、true
、およびbaz1
と証明項のbool
、baz2
、baz
を交換し、何が起こるか見てみましょう:以下で失敗し上記
Goal baz1 <> baz2.
Fail exact (fun prf : baz1 = baz2 =>
eq_ind baz1 (fun e : baz => if e then False else True) I baz2 prf).
Abort.
:
The command has indeed failed with message:
Incorrect elimination of e
in the inductive type baz
:
the return type has sort Type
while it should be Prop
.
Elimination of an inductive object of sort Prop
is not allowed on a predicate in sort Type
because proofs can be eliminated only to build proofs.
エラーの理由はこの抽象である:
Fail Check (fun e : baz => if e then False else True).
上記に同じエラーメッセージが表示されます。 なぜそれが簡単か分かります。抽象化のタイプはbaz -> Prop
で、baz -> Prop
のタイプは何ですか?提案へ
Check baz -> Prop. (* baz -> Prop : Type *)
命題の証明から地図Type
に住んで、ないProp
で!それ以外の場合は、宇宙の矛盾が発生します。
それを行うためにProp
を打破する方法がないのため、私たちの結論は、不平等を証明する方法がないということです - あなただけFalse
の証明を構築するために(baz1 = baz2
)を書き換え使用することはできません。
別の引数(私はそれが既に@gallaisによって提案されている参照):それはいくつかの巧妙なトリックを使用してProp
内に留まる証明を行うことができたならば、その後、proof irrelevance公理はコックのロジックと矛盾のようになります。
Variable contra : baz1 <> baz2.
Axiom proof_irrelevance : forall (P:Prop) (p1 p2:P), p1 = p2.
Check contra (proof_irrelevance _ baz1 baz2). (* False *)
しかし、一貫性があることが知られています(Coq's FAQを参照)。
Universes の章CPDTのセクション「プロップユニバース」を具体的に参照してください。
@AntonTrunov申し訳ありませんが、それはタイプミスでした。 – igorbark