補題の未完成の証明を以下に示します。
Goal forall (P : Type -> Prop) (Q : Prop),
((forall x, (P x)) -> Q) -> (exists x, P x -> Q).
Proof.
intros.
eapply ex_intro. intros. apply H. intros. eapply H0.
問題は最後のeapply
失敗であり、メッセージが表示されます
Error:
In environment
P : Type -> Prop
Q : Prop
H : (forall x : Type, P x) -> Q
H0 : P ?x
x : Type
Unable to unify "?x" with "x" (cannot instantiate "?x" because "x" is not in
its scope: available
arguments are "P" "Q" "H").
証明の手順自体は、すでに非常に厄介です。証明は、存在する変数を構築して、 後半で、それを使用してそれをインスタンス化しようとします 仮説を適用した後に前提として得られた(forall x, (P x)) -> Q
。証明の手順は、周期的な証明に見えます。
このメッセージは一般的に何を意味していますか?このメッセージは、どのタイプの論理的誤りを示していますか?
Coqからの最近のgithubの問題が実際にあり、スコープ外のevarのインスタンス化は、QEDによってブロックされることを除いて、誤りを証明できることを示しています。
2
これを建設的に証明することはできません。古典論理の適切な公理を仮定すればできます。
—
Derek Elkinsが
@DerekElkins私はそれを学びました。しかし、範囲外のインスタンス化は、これが建設的なロジックで機能しない理由を明らかにしますか?
—
Jason Hu
それはそれを示唆し始めますが、私はそうは言わないでしょう。これを建設的に証明することに失敗するあらゆる種類の方法があり、明らかにこれが証明できないためにはすべてのアプローチが失敗する必要があります。存在を建設的に証明するには、証人を作成する必要があります。この場合、任意の型の任意の値を作成する必要がありますが、これは不可能であり、どの仮定も型の値を提供しません。一方、除外された中間の法則は、どこからでも値を魔法にかけることを可能にします。
—
Derek Elkinsが2017
古典的な後続計算におけるLEMの標準的な証明は、確かに「その範囲をエスケープする変数」です。これについてはあまり注意深く見ていませんが、同じような状況になる可能性があります。
—
ガレーヌ2017