logique_propositionnelle_avec_variables
Ce module formalise la logique propositionnelle (avec variable
propositionnelle).
Le formules propositionnelle avec variables propositionnelles
Définition des formules
On désigne les variables par des entiers.
| Non: formule ⟶ formule
| Ou: formule ⟶ formule ⟶ formule
| Et: formule ⟶ formule ⟶ formule
| Implique: formule ⟶ formule ⟶ formule.
| Ou: formule ⟶ formule ⟶ formule
| Et: formule ⟶ formule ⟶ formule
| Implique: formule ⟶ formule ⟶ formule.
Check Vrai.
Check Faux.
Check (Var 23).
Check (Ou Vrai Vrai).
Check (Ou Faux Vrai).
Check (Ou (Ou Vrai Faux) Vrai).
Notation "⊤":= Vrai.
Notation "⊥":= Faux.
Notation "¬ X":= (Non X).
Notation "X ∨ Y":= (Ou X Y).
Notation "X ∧ Y":= (Et X Y).
Notation "X ⇒ Y":= (Implique X Y).
Les variables seront également plus lisibles en notant le numéro de
la variable en indice de la lettre X ('x' majuscule).
Interprétation d'une formule (Sémantique)
Définition de l'interprétation d'une formule
Function interp_def (v:nat ⟶ bool) (f:formule) : bool :=
match f with
| ⊤ => table_Vrai
| ⊥ => table_Faux
| Var i => v i
| ¬ f => table_Non (interp_def v f)
| f1 ∨ f2 => table_Ou (interp_def v f1) (interp_def v f2)
| f1 ∧ f2 => table_Et (interp_def v f1) (interp_def v f2)
| f1 ⇒ f2 => table_Implique (interp_def v f1) (interp_def v f2)
end.
→ true
→ true
→ false
Definition val_X1_true := (fun x => match x with 1 => true | _ => false end).
Definition val_X1_false := (fun x => match x with 1 => false | _ => false end).
Eval compute in interp_def val_X1_true (Implique ⊤ (Ou ⊥ X1)).
→ true
→ false
Version optimisée qui n'évalue la sous-formule de droite que si
nécessaire.
Function interp (v:nat ⟶ bool) (f:formule) : bool :=
match f with
| ⊤ => true
| ⊥ => false
| Var i => v i
| ¬f => if interp v f then false else true
| f1 ∨ f2 => if interp v f1 then true else interp v f2
| f1 ∧ f2 => if interp v f1 then interp v f2 else false
| f1 ⇒ f2 => if interp v f1 then interp v f2 else true
end.
Definition v1 (n:nat): bool :=
match n with
| 1 => true
| 2 => false
| 3 => true
| _ => false
end.
Definition v2 (n:nat): bool :=
match n with
| 1 => false
| 2 => true
| 3 => true
| _ => false
end.
Eval compute in interp_def v1 (Implique Vrai (Ou Vrai Faux)).
match n with
| 1 => true
| 2 => false
| 3 => true
| _ => false
end.
Definition v2 (n:nat): bool :=
match n with
| 1 => false
| 2 => true
| 3 => true
| _ => false
end.
Eval compute in interp_def v1 (Implique Vrai (Ou Vrai Faux)).
→ true
→ true
→ false
→ false
→ false
→ false
→ true
→ false
→ true
→ true
→ true
→ false
→ false
→ false
→ false
→ true
→ false
→ true
Conséquence, modèle etc
Résultat supplémentaire: l'interprétation est décidable. Ce ne
sera pas le cas pour la logique des prédicats avec
quantificateurs
Une autre définition pour l'équivalence: l'interprétation des deux
formules est toujours identique.
Preuve d'equivalence entre les deux notions d'équivalence.
Lemma modele1 : forall v, ⊧[v] X1 ∨ ¬ X1.
Lemma modele2 : forall v, ⊧[v] (X1 ∨ ¬ X2) ∨ X2.
Lemma conseq1: (X1∨¬X2) ∧ X2 ⊧ X1.
Lemma eq_implique : forall φ ψ : formule, φ ⇒ ψ ≡ ¬φ ∨ ψ.
Lemma eq_et : forall φ ψ: formule, (φ ∧ ψ) ≡ ¬ (¬φ ∨ ¬ψ).
Lemma eq_not_true : ⊥ ≡ ¬ ⊤.
Lemma eq_not_false : ⊤ ≡ ¬ ⊥.
Réduction des connecteurs au sous-ensemble {⊤,¬,∨}
Function reduce (f:formule) : formule :=
match f with
| ⊤ => ⊤
| ⊥ => ¬ ⊤
| Var i => Var i
| ¬ f => ¬ (reduce f)
| f1 ∨ f2 => (reduce f1) ∨ (reduce f2)
| f1 ∧ f2 => ¬ (¬ (reduce f1) ∨ ¬ (reduce f2))
| f1 ⇒ f2 => ¬ (reduce f1) ∨ (reduce f2)
end.
Lemma reduce_correct:
forall v, forall f:formule, interp_def v f = interp_def v (reduce f).
Lemma reduce_equiv : forall f:formule, f ≡ (reduce f).
Propriété d'être formé uniquement avec des ¬, ∨ et ⊤ ou Var.
Inductive is_reduced : formule ⟶ Prop :=
Vrai_is_red: is_reduced ⊤
| Var_is_red: forall i, is_reduced (Var i)
| Non_is_red: forall f,is_reduced f ⟶ is_reduced (¬ f)
| Or_is_red: forall f g,is_reduced f ⟶ is_reduced g ⟶ is_reduced (f ∨ g).
la fonction reduce retourne bien une formule de cette forme.
Pour prouver f ⊧ g on peut prouver f ∧ ¬g ⊧ ⊥.
Lemma and_affaiblissement_conseq : forall v f1 f2, ⊧[v] f1∧f2 ⟶ ⊧[v]f1.
Lemma and_affaiblissement_contr : forall f1 f2, f1 ⊧ ⊥ ⟶ f1∧f2 ⊧ ⊥.
Lemma Et_sym : forall f1 f2, f1 ∧ f2 ≡ f2 ∧ f1.
Lemma Et_assoc : forall f1 f2 f3, f1 ∧ (f2 ∧ f3) ≡ (f1 ∧ f2) ∧ f3.
Function extraction_disjuntion (f F: formule): option formule :=
match F with
| g ∧ F´ =>
if formule_eq_dec f g then Some F´
else
if formule_eq_dec f F´ then Some g
else
match extraction_disjuntion f F´ with
None => None
| Some F´´ => Some (g ∧ F´´)
end
| g => if formule_eq_dec f g then Some ⊤ else None
end.
Eval compute in (extraction_disjuntion (¬X1) (((X1 ∨ ¬X2) ∧ X2) ∧ ¬X1 ∧ X2)).
Eval compute in (extraction_disjuntion (¬X1) (((X1 ∨ ¬X2) ∧ X2) ∧ ¬X1)).
Eval compute in (extraction_disjuntion ((X1 ∨ ¬X2) ∧ X2) (((X1 ∨ ¬X2) ∧ X2) ∧ ¬X1)).
Lemma Et_et_true : forall f, f ≡ f ∧ ⊤.
Lemma extraction_disjuntion_ok :
forall f F F´, extraction_disjuntion f F = Some F´ ⟶ (F ≡ f ∧ F´).
Lemma tableau_Ou :
forall F f1 f2, ((f1 ∧ F ⊧ ⊥) ∧ (f2 ∧ F ⊧ ⊥)) ⟶ (f1 ∨ f2) ∧ F ⊧ ⊥.
Lemma tableau_Ou´ : forall f1 f2, (f1 ⊧ ⊥) ∧ (f2 ⊧ ⊥) ⟶ (f1 ∨ f2) ⊧ ⊥.
Lemma tableau_nonEt:
forall F f1 f2, (¬f1 ∧ F ⊧ ⊥) ∧ (¬f2 ∧ F ⊧ ⊥) ⟶ ¬(f1 ∧ f2) ∧ F ⊧ ⊥.
Lemma tableau_nonEt´ : forall f1 f2, (¬f1 ⊧ ⊥) ∧ (¬f2 ⊧ ⊥) ⟶ ¬(f1 ∧ f2) ⊧ ⊥.
Lemma tableau_implique :
forall F f1 f2, (¬f1 ∧ F ⊧ ⊥) ∧ (f2 ∧ F ⊧ ⊥) ⟶ (f1 ⇒ f2) ∧ F ⊧ ⊥.
Lemma tableau_implique´ : forall f1 f2, (¬f1 ⊧ ⊥) ∧ (f2 ⊧ ⊥) ⟶ (f1 ⇒ f2) ⊧ ⊥.
Lemma tableau_Et: forall F f1 f2, f1 ∧ f2 ∧ F ⊧ ⊥ ⟶ (f1 ∧ f2) ∧ F ⊧ ⊥.
Lemma tableau_nonimplique : forall F f1 f2, f1 ∧ ¬f2 ∧ F ⊧ ⊥ ⟶ ¬(f1 ⇒ f2) ∧ F ⊧ ⊥.
Lemma tableau_nonimplique´ : forall f1 f2, f1 ∧ ¬f2 ⊧ ⊥ ⟶ ¬(f1 ⇒ f2) ⊧ ⊥.
Lemma tableau_nonOu : forall F f1 f2, ¬f1 ∧ ¬f2 ∧ F ⊧ ⊥ ⟶ ¬(f1 ∨ f2) ∧ F ⊧ ⊥.
Lemma tableau_nonOu´ : forall f1 f2, ¬f1 ∧ ¬f2 ⊧ ⊥ ⟶ ¬(f1 ∨ f2) ⊧ ⊥.
Lemma tableau_ferme_branche : forall F f, (F ∧ f) ∧ ¬f ⊧ ⊥.
Lemma tableau_ferme_branche´ : forall F f, f ∧ ¬f ∧ F ⊧ ⊥.
Lemma tableau_ferme_branche´´ : forall F f, (f ∧ ¬f) ∧ F ⊧ ⊥.
Lemma p_et_p_eq : forall p, p∧p ≡ p.
Lemma conseq1: (X1∨¬X2) ∧ X2 ⊧ X1.
Proof.
apply conseq_by_contradiction.
do_Et (X1 ∨ ¬X2) X2.
do_Ou X1 (¬X2).
- do_ferme X1.
- do_ferme X2.
Qed.
Lemma conseq2 : (X1 ∧ X3 ) ∧ (¬X1 ∨ X2) ⊧ ⊥.
Proof.
do_Ou (¬X1) X2.
- do_ferme X1.
Echec
Abort.
Lemma conseq3 : (¬ (X1 ⇒ (X2 ⇒ X1))) ∧ ⊤ ⊧ ⊥.
Proof.
do_NonImplique X1 (X2 ⇒ X1).
do_NonImplique X2 X1.
do_ferme X1.
Qed.
Lemma conseq4 : (¬ (X1 ∨ X2)) ∧ X1 ⊧ ⊥.
Proof.
do_nonOu X1 X2.
do_ferme X1.
Qed.
Lemma conseq5 : (¬ (X1 ∧ X2)) ∧ X1 ∧ X2 ⊧ ⊥.
Proof.
do_nonEt X1 X2.
- do_ferme X1.
- do_ferme X2.
Qed.
Lemma conseq_exam_2014 : (¬X2∨¬X3) ⊧ (X2 ∧ X3) ⇒ X1.
Proof.
apply conseq_by_contradiction.
do_NonImplique (X2 ∧ X3) (X1).
do_Et (X2)(X3).
do_Ou (¬X2) (¬X3).
- do_ferme X2.
- do_ferme X3.
Qed.
Lemma conseq6 : (X1 ∨ X2)∧(¬X1 ∧ ¬X2) ⊧ ⊥.
Proof.
do_Ou X1 X2.
- do_ferme X1.
- do_ferme X2.
Qed.
Lemma conseq7 : ⊤ ⊧ (X1 ⇒ (X2 ⇒ X3)) ⇒ ((X1 ⇒ X2) ⇒ (X1 ⇒ X3)).
Proof.
apply conseq_by_contradiction.
do_NonImplique (X1 ⇒ (X2 ⇒ X3)) ((X1 ⇒ X2) ⇒ (X1 ⇒ X3)).
do_Implique X1 (X2 ⇒ X3).
- do_NonImplique (X1 ⇒ X2) (X1 ⇒ X3).
do_Implique X1 X2.
+ do_NonImplique X1 X3.
do_ferme X1.
+ do_NonImplique X1 X3.
do_ferme X1.
- do_NonImplique (X1 ⇒ X2) (X1 ⇒ X3).
do_Implique X1 X2.
+ do_NonImplique X1 X3.
do_ferme X1.
+ do_Implique X2 X3.
× do_ferme X2.
× do_NonImplique X1 X3.
do_ferme X3.
Qed.
Lemma conseq3 : (¬ (X1 ⇒ (X2 ⇒ X1))) ∧ ⊤ ⊧ ⊥.
Proof.
do_NonImplique X1 (X2 ⇒ X1).
do_NonImplique X2 X1.
do_ferme X1.
Qed.
Lemma conseq4 : (¬ (X1 ∨ X2)) ∧ X1 ⊧ ⊥.
Proof.
do_nonOu X1 X2.
do_ferme X1.
Qed.
Lemma conseq5 : (¬ (X1 ∧ X2)) ∧ X1 ∧ X2 ⊧ ⊥.
Proof.
do_nonEt X1 X2.
- do_ferme X1.
- do_ferme X2.
Qed.
Lemma conseq_exam_2014 : (¬X2∨¬X3) ⊧ (X2 ∧ X3) ⇒ X1.
Proof.
apply conseq_by_contradiction.
do_NonImplique (X2 ∧ X3) (X1).
do_Et (X2)(X3).
do_Ou (¬X2) (¬X3).
- do_ferme X2.
- do_ferme X3.
Qed.
Lemma conseq6 : (X1 ∨ X2)∧(¬X1 ∧ ¬X2) ⊧ ⊥.
Proof.
do_Ou X1 X2.
- do_ferme X1.
- do_ferme X2.
Qed.
Lemma conseq7 : ⊤ ⊧ (X1 ⇒ (X2 ⇒ X3)) ⇒ ((X1 ⇒ X2) ⇒ (X1 ⇒ X3)).
Proof.
apply conseq_by_contradiction.
do_NonImplique (X1 ⇒ (X2 ⇒ X3)) ((X1 ⇒ X2) ⇒ (X1 ⇒ X3)).
do_Implique X1 (X2 ⇒ X3).
- do_NonImplique (X1 ⇒ X2) (X1 ⇒ X3).
do_Implique X1 X2.
+ do_NonImplique X1 X3.
do_ferme X1.
+ do_NonImplique X1 X3.
do_ferme X1.
- do_NonImplique (X1 ⇒ X2) (X1 ⇒ X3).
do_Implique X1 X2.
+ do_NonImplique X1 X3.
do_ferme X1.
+ do_Implique X2 X3.
× do_ferme X2.
× do_NonImplique X1 X3.
do_ferme X3.
Qed.
This page has been generated by coqdoc