Non sono un esperto in materia, ma è stato recentemente discusso su . Riassumo le conclusioni di questo thread. Se vuoi capire meglio questo tipo di problemi, dovresti dare un'occhiata a double-negation translation.
Il problema rientra nel calcolo proposizionale intuizionista e può quindi essere deciso da tauto
.
Theorem excluded_middle_irrefutable: forall (P:Prop), ~~(P \/ ~ P).
tauto.
Qed.
Il thread fornisce anche una prova più elaborata. Cercherò di spiegare come mi sarebbe venuta in mente questa prova. Si noti che di solito è più facile per me a che fare con l'interpretazione linguaggio di programmazione di lemmi, in modo che è quello che farò:
Theorem excluded_middle_irrefutable: forall (P:Prop), ~~(P \/ ~ P).
unfold not.
intros P f.
Ci viene chiesto di scrivere una funzione che prende la funzione f
e produce un valore di tipo False
. L'unico modo per arrivare a False
a questo punto è invocare la funzione f
.
apply f.
Di conseguenza, ci viene chiesto di fornire gli argomenti alla funzione f
. Abbiamo due scelte, o passare P
o P -> False
. Non vedo un modo per costruire un P
quindi sto scegliendo la seconda opzione.
right.
intro p.
siamo di nuovo al punto di partenza, se non che ora abbiamo un p
lavorare con! Quindi applichiamo f
perché è l'unica cosa che possiamo fare.
apply f.
E ancora, ci viene chiesto di fornire l'argomento f
. Questo è facile ora, però, perché abbiamo un p
con cui lavorare.
left.
apply p.
Qed.
Il thread menziona anche una prova basata su alcuni lemmi più semplici. Il primo lemma è ~(P /\ ~P)
.
Lemma lma (P:Prop) : ~(P /\ ~P).
unfold not.
intros H.
destruct H as [p].
apply H.
apply p.
Qed.
Il secondo lemma è ~(P \/ Q) -> ~P /\ ~Q
:
Lemma lma' (P Q:Prop) : ~(P \/ Q) -> ~P /\ ~Q.
unfold not.
intros H.
constructor.
- intro p.
apply H.
left.
apply p.
- intro q.
apply H.
right.
apply q.
Qed.
Questi lemmi sono sufficienti per lo spettacolo:
Theorem excluded_middle_irrefutable: forall (P:Prop), ~~(P \/ ~ P).
intros P H.
apply lma' in H.
apply lma in H.
apply H.
Qed.
Forse guardando il termine prova (creato con 'tauto' e qualche semplificazione) fa un po 'di senso: 'Controllare il divertimento (P: Prop) (H: ~ (P \/~ P)) => False_ind False (H (o_intror (fun H0 => H (or_introl H0)))).' – larsr