discriminate
舞台裏で戦術がどのように機能するのか興味がありました。したがって、私はいくつかの実験を行いました。
最初に単純な帰納的定義:
Inductive AB:=A|B.
discriminate
次に、戦術によって証明できる簡単な補題:
Lemma l1: A=B -> False.
intro.
discriminate.
Defined.
証明がどのように見えるか見てみましょう:
Print l1.
l1 =
fun H : A = B =>
(fun H0 : False => False_ind False H0)
(eq_ind A
(fun e : AB => match e with
| A => True
| B => False
end) I B H)
: A = B -> False
これはかなり複雑に見えますが、ここで何が起こっているのかわかりません。したがって、同じ補題をより明示的に証明しようとしました。
Lemma l2: A=B -> False.
apply (fun e:(A=B) => match e with end).
Defined.
Coqがこれで何を作ったかをもう一度見てみましょう:
Print l2.
l2 =
fun e : A = B =>
match
e as e0 in (_ = a)
return
(match a as x return (A = x -> Type) with
| A => fun _ : A = A => IDProp
| B => fun _ : A = B => False
end e0)
with
| eq_refl => idProp
end
: A = B -> False
今、私は完全に混乱しています。これはさらに複雑です。ここで何が起こっているのか誰でも説明できますか?