Domanda

Come si dimostra (forall x, P x / \ Q x) - > (forall x, P x) in Coq? Ho provato per ore e non riesco a capire come abbattere l'antecedente a qualcosa che Coq può digerire. (Sono un novizio, ovviamente :)

È stato utile?

Soluzione

Puoi farlo più rapidamente semplicemente applicando H, ma questo script dovrebbe essere più chiaro.

Lemma foo : forall (A:Type) (P Q: A-> Prop), (forall x, P x /\ Q x) -> (forall x, P x).
intros.
destruct (H x). 
exact H0.
Qed.

Altri suggerimenti

Prova

elim (H x).

In realtà, l'ho capito quando l'ho trovato:

Mathematics for Computer Scientists 2

Nella lezione 5 risolve esattamente lo stesso problema e usa " cut (P x / \ Q x) " che riscrive l'obiettivo da " P x " a " P x / \ Q x - > P x " ;. Da lì puoi fare alcune manipolazioni e quando l'obiettivo è solo " P x / \ Q x " puoi applicare " forall x: P x / \ Q x " e il resto è semplice.

Assume ForAll x: P(x) /\ Q(x)
   var x; 
      P(x) //because you assumed it earlier
   ForAll x: P(x)
(ForAll x: P(x) /\ Q(x)) => (ForAll x: P(x))

Intuitivamente, se per tutte le x, P (x) E Q (x) tieni, quindi per tutte le x, P (x).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top