logique_predicats_avec_quantificateurs
Ce module formalise la logique des prédicats avec quantificateur,
les prédicats sont n-aires (nombre quelconque d'arguments) mais
les termes (arguments des prédicats) ne contiennent pas de
symboles de fonctions: ce sont uniquement des variables.
Les formules
Les termes
: terme
Le type des formules logique avec prédicats (sans symbole de
fonction) avec quantificateur. Les noms de prédicats sont
représentés par des numéros, un prédicat prend un seul argument:
une liste de termes. Les quantificateurs prennent en argument le
numéro de la variable quantifiée.
Les formules
Inductive formule : Type :=
| Vrai: formule
| Faux: formule
| Var: ℕ → formule
| Non: formule → formule
| Ou: formule → formule → formule
| Et: formule → formule → formule
| Implique: formule → formule → formule
| Pred: ℕ → list terme → formule
| FORALL: ℕ → formule → formule
| EXIST: ℕ → formule → formule.
: formule
Check (Ou (Ou (Pred 1 (cons (TVar 1) (cons (TVar 2) nil))) Faux) Vrai).
Check (FORALL 1 (Ou (Ou (Pred 1 (cons (TVar 1) (cons (TVar 2) nil))) Faux) Vrai)).
Check (EXIST 1 (Ou (Ou (Pred 1 (cons (TVar 1) (cons (TVar 2) nil))) Faux) Vrai)).
Check (FORALL 1 (Ou (Ou (Pred 1 (cons (TVar 1) (cons (TVar 2) nil))) Faux) Vrai)).
Check (EXIST 1 (Ou (Ou (Pred 1 (cons (TVar 1) (cons (TVar 2) nil))) 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).
Notation "´X1´":= (Var 1).
Notation "´X2´":= (Var 2).
Notation "´x1´":= (TVar 1).
Notation "´x2´":= (TVar 2).
Notation "´p1´ l":= (Pred 1 l).
Notation "´p2´ l":= (Pred 2 l).
Notation "´∀x1´ frm":= (FORALL 1 frm).
Notation "´∀x2´ frm":= (FORALL 2 frm).
Notation "´∃x1´ frm":= (EXIST 1 frm).
Notation "´∃x2´ frm":= (EXIST 2 frm).
Check (Var 7).
Check X7.
Check (Pred 1 (x1::nil)).
Check (p1 [x1 , x2 , x3]).
Check (p1 [x1 , x2 , x3]).
Check (∀x1 p1 [x1 , x2 , x3]).
Check (∀x1∃x2 p1 [x1 , x2 , x3]).
Décision de l'égalité sur les formules, Attention ce n'est pas la
vraie égalité de formule puisque les noms de variables ne sont pas
ignorés.
Function formule_beq (φ ψ:formule) {struct φ}: bool :=
match φ,ψ with
| ⊤,⊤ ⇒ true
| ⊥,⊥ ⇒ true
| Var p,Var q ⇒ beq_nat p q
| φ1 ⇒ φ2, ψ1 ⇒ ψ2 ⇒ formule_beq φ1 ψ1 && formule_beq φ2 ψ2
| φ1 ∧ φ2,ψ1 ∧ ψ2 ⇒ formule_beq φ1 ψ1 && formule_beq φ2 ψ2
| φ1 ∨ φ2,ψ1 ∨ ψ2 ⇒ formule_beq φ1 ψ1 && formule_beq φ2 ψ2
| ¬φ,¬ψ ⇒ formule_beq φ ψ
| (Pred n1 l1) , (Pred n2 l2) ⇒ beq_nat n1 n2 &&
forallb2 terme_beq l1 l2
| FORALL i φ, FORALL j ψ ⇒ beq_nat i j && formule_beq φ ψ
| EXIST i φ, EXIST j ψ ⇒ beq_nat i j && formule_beq φ ψ
| _,_ ⇒ false
end.
Lemma terme_eq_ok : ∀ t1 t2:terme, terme_beq t1 t2 = true ↔ t1 = t2.
Lemma terme_eq_true_eq_iff: ∀ l1 l2,
Forall2 (fun x y : terme ⇒ terme_beq x y = true) l1 l2
↔ Forall2 Logic.eq l1 l2.
Lemma formule_eq_okr : ∀ φ ψ:formule, formule_beq φ ψ = true → φ = ψ.
Lemma formule_eq_okl : ∀ φ ψ:formule, φ = ψ → formule_beq φ ψ = true.
Lemma formule_eq_ok : ∀ φ ψ:formule, φ = ψ ↔ formule_beq φ ψ = true.
Lemma formule_neq_ok : ∀ φ ψ:formule, φ ≠ ψ ↔ formule_beq φ ψ = false.
Lemma formule_eq_dec : ∀ f1 f2: formule, {f1 = f2} + {f1≠f2}.
match φ,ψ with
| ⊤,⊤ ⇒ true
| ⊥,⊥ ⇒ true
| Var p,Var q ⇒ beq_nat p q
| φ1 ⇒ φ2, ψ1 ⇒ ψ2 ⇒ formule_beq φ1 ψ1 && formule_beq φ2 ψ2
| φ1 ∧ φ2,ψ1 ∧ ψ2 ⇒ formule_beq φ1 ψ1 && formule_beq φ2 ψ2
| φ1 ∨ φ2,ψ1 ∨ ψ2 ⇒ formule_beq φ1 ψ1 && formule_beq φ2 ψ2
| ¬φ,¬ψ ⇒ formule_beq φ ψ
| (Pred n1 l1) , (Pred n2 l2) ⇒ beq_nat n1 n2 &&
forallb2 terme_beq l1 l2
| FORALL i φ, FORALL j ψ ⇒ beq_nat i j && formule_beq φ ψ
| EXIST i φ, EXIST j ψ ⇒ beq_nat i j && formule_beq φ ψ
| _,_ ⇒ false
end.
Lemma terme_eq_ok : ∀ t1 t2:terme, terme_beq t1 t2 = true ↔ t1 = t2.
Lemma terme_eq_true_eq_iff: ∀ l1 l2,
Forall2 (fun x y : terme ⇒ terme_beq x y = true) l1 l2
↔ Forall2 Logic.eq l1 l2.
Lemma formule_eq_okr : ∀ φ ψ:formule, formule_beq φ ψ = true → φ = ψ.
Lemma formule_eq_okl : ∀ φ ψ:formule, φ = ψ → formule_beq φ ψ = true.
Lemma formule_eq_ok : ∀ φ ψ:formule, φ = ψ ↔ formule_beq φ ψ = true.
Lemma formule_neq_ok : ∀ φ ψ:formule, φ ≠ ψ ↔ formule_beq φ ψ = false.
Lemma formule_eq_dec : ∀ f1 f2: formule, {f1 = f2} + {f1≠f2}.
Définition de l'interprétation d'une formule
Valuation
- une valuation I des variables propositionnelles,
- un domaine d'interprétation pour les termes (D),
- une valuation pour les termes, c'est-à-dire les variables de terme puisqu'on n'a pas de symbole de fonction. La valuation interp_t prend donc un numéro de variable de terme en argument et retourne un élément de D.
- une valuation pour les prédicats. Un prédicat est désigné
par un entier, la valuation interp_p prend donc un entier
et retourne l'interprétation du prédicat correspondant: une
fonction de DxDxD... -> bool, où D est le domaine
d'interprétation des terme.
Record Valuation {D:Type} :=
{ vpredicat: nat → (list D → bool);
vterme: terme → D;
vproposition: nat → bool;
temoin:D }.
Substitution dans la valuation des termes
Definition subst_in_interp interp i (n:Z) :=
{| vpredicat:= interp.(vpredicat) ;
vproposition:=interp.(vproposition);
temoin:=interp.(temoin);
On retourne n si Var i est demandée, sinon on passe la
main à l'ancienne fonction.
vterme:= fun trm:terme ⇒
let ´(TVar j) := trm in
if beq_nat j i then n
else (interp.(vterme)) trm |}.
Notation "I [ i <- x ]" := (subst_in_interp I i x) (at level 89).
Interprétation d'une formule
Inductive interp_def (I:@Valuation Z): formule → bool → Prop :=
| I_Vrai: interp_def I ⊤ table_Vrai
| I_Faux: interp_def I ⊥ table_Faux
| I_Var: ∀ i b, I.(vproposition) i = b → interp_def I (Var i) b
| I_Pred: ∀ i l b, I.(vpredicat) i (map I.(vterme) l) = b
→ interp_def I (Pred i l) b
| I_Non: ∀ frm b1 b, interp_def I frm b1 →
negb b1 = b →
interp_def I (¬ frm) b
| I_Ou: ∀ f1 f2 b1 b2 b, interp_def I f1 b1
→ interp_def I f2 b2
→ orb b1 b2 = b
→ interp_def I (f1 ∨ f2) b
| I_Et: ∀ f1 f2 b1 b2 b, interp_def I f1 b1
→ interp_def I f2 b2
→ andb b1 b2 = b
→ interp_def I (f1 ∧ f2) b
| I_Implique: ∀ f1 f2 b1 b2 b, (interp_def I f1 b1)
→ (interp_def I f2 b2)
→ implb b1 b2 = b
→ (interp_def I (f1 ⇒ f2) b)
| I_Forall: ∀ f1 n, (∀ x:Z, interp_def (subst_in_interp I n x) f1 true)
→ interp_def I (FORALL n f1) true
| I_NotForall: ∀ f1 n, (∃ x:Z, interp_def (subst_in_interp I n x) f1 false)
→ interp_def I (FORALL n f1) false
| I_Exist: ∀ f1 n, (∃ x:Z, interp_def (subst_in_interp I n x) f1 true)
→ interp_def I (EXIST n f1) true
| I_NotExist: ∀ f1 n, (∀ x:Z, interp_def (subst_in_interp I n x) f1 false)
→ interp_def I (EXIST n f1) false.
On utilisera l'abus de notation suivant: I[f]->b à la place de
(interp_def I g b). Attention toutefois à garder en mémoire qu'une
interprétation I ne s'applique pas à une formule mais à une
variable, c'est la fonction interp_def qui permet de généraliser
une interprétation aux formules.
Déterminisme et totalité de l'interprétation d'une formule.
Lemma interp_def_det :
∀ f1 interp b1,
interp_def interp f1 b1
→ ∀ b2, interp_def interp f1 b2 → b1 = b2.
Ceci introduit l'axiome suivant: ∀ P : Prop, P ∨ ¬ P.
La relation d'interprétation est totale: pour toute formule et
toute interprétation il existe une valeur interprétation
booléenne. Pour information cette preuve utilise le tiers-exclu.
Corollaire du déterminisme + totalité de l'interpétation.
Module Exemples.
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.
Definition is_zero l :=
match l with
| 0%Z::_ ⇒ true
| _ ⇒ false
end.
Definition vp (n:nat): (list Z → bool) :=
match n with
| 1 ⇒ is_zero
| _ ⇒ (fun _ ⇒ false)
end.
Definition vt trm :=
match trm with
| TVar i ⇒ (0)%Z
end.
Definition III:Valuation := {| vpredicat:=vp; vterme:=vt; vproposition:=v1; temoin:=0%Z |}.
Definition III´:Valuation := {| vpredicat:=vp; vterme:=vt; vproposition:=v2; temoin:=0%Z |}.
Lemma Ex1: interp_def III (⊤ ⇒ (⊤ ∨ ⊥)) true.
Lemma Ex1´: interp_def III (⊤ ⇒ (⊤ ∨ ⊥)) false.
Lemma Ex2: interp_def III´ (⊤ ⇒ (⊤ ∨ ⊥)) true.
Lemma Ex3: interp_def III´ (p1[x1]) true.
Lemma Ex4: interp_def III´ (p1[x1] ⇒ ⊥) false.
Lemma Ex5: interp_def III´ (p1[x1] ⇒ (⊥ ∧ ⊥)) false.
Lemma Ex5´: interp_def III´ (p1[x1] ⇒ (⊥ ∧ ⊥)) true.
End Exemples.
Conséquence, modèle etc
Definition valuation: Type:= @Valuation Z.
Definition interpretation: valuation → formule → bool → Prop := interp_def.
Module Exemples_modeles.
Lemma modele1 : ∀ v n, ⊧[v] Var n ∨ ¬ (Var n).
Lemma modele2 : ∀ v, ⊧[v] (X1 ∨ ¬ X2) ∨ X2.
End Exemples_modeles.
Module Exemples_conseq.
Lemma conseq1: (X1∨¬X2) ∧ X2 ⊧ X1.
End Exemples_conseq.
Lemma eq_implique : ∀ x y : formule, x ⇒ y ≡ ¬x ∨ y.
Lemma eq_et : ∀ x y: formule, (x ∧ y) ≡ ¬ (¬x ∨ ¬y).
Lemma eq_not : ⊥ ≡ ¬ ⊤.
Lemma eq_not_exist : ∀ i, ∀ f : formule, (¬ (FORALL i f)) ≡ EXIST i (¬f).
Lemma eq_not_forall : ∀ i, ∀ f : formule, (¬ (EXIST i f)) ≡ FORALL i (¬f).
Pour prouver f ⊧ g on peut prouver f ∧ ¬g ⊧ ⊥ .
Lemma and_affaiblissement_conseq : ∀ v f1 f2, v[f1∧f2]->true → v[f1]->true.
Lemma and_affaiblissement_contr : ∀ f1 f2, f1 ⊧ ⊥ → f1∧f2 ⊧ ⊥ .
Lemma Et_sym : ∀ f1 f2, f1 ∧ f2 ≡ f2 ∧ f1.
Lemma Et_assoc : ∀ f1 f2 f3, f1 ∧ (f2 ∧ f3) ≡ (f1 ∧ f2) ∧ f3.
Function extraction_disjuntion (f F: formule): option formule :=
match F with
| (g ∧ F´) ⇒
if formule_beq f g then Some F´
else
if formule_beq 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 : ∀ f, f ≡ f ∧ ⊤.
Lemma extraction_disjuntion_ok :
∀ f F F´, extraction_disjuntion f F = Some F´ → (F ≡ f ∧ F´).
Lemma tableau_Ou : ∀ F f1 f2,
((f1 ∧ F ⊧ ⊥)
∧ (f2 ∧ F ⊧ ⊥))
→ (f1 ∨ f2) ∧ F ⊧ ⊥.
Lemma tableau_Ou´ : ∀ f1 f2,
(f1 ⊧ Faux)
∧ (f2 ⊧ Faux)
→ (f1 ∨ f2) ⊧ Faux.
Lemma tableau_nonEt : ∀ F f1 f2,
(¬f1 ∧ F ⊧ ⊥) ∧ (¬f2 ∧ F ⊧ ⊥)
→ ¬(f1 ∧ f2) ∧ F ⊧ ⊥.
Lemma tableau_nonEt´ : ∀ f1 f2,
(¬f1 ⊧ ⊥) ∧ (¬f2 ⊧ ⊥)
→ ¬(f1 ∧ f2) ⊧ ⊥.
Lemma tableau_implique : ∀ F f1 f2,
(¬f1 ∧ F ⊧ ⊥) ∧ (f2 ∧ F ⊧ ⊥)
→ (f1 ⇒ f2) ∧ F ⊧ ⊥.
Lemma tableau_implique´ : ∀ f1 f2,
(¬f1 ⊧ ⊥) ∧ (f2 ⊧ ⊥)
→ (f1 ⇒ f2) ⊧ ⊥.
Lemma tableau_Et : ∀ F f1 f2, f1 ∧ f2 ∧ F ⊧ ⊥ → (f1 ∧ f2) ∧ F ⊧ ⊥.
Lemma tableau_Et´ : ∀ f1 f2, f1 ∧ f2 ⊧ ⊥ → (f1 ∧ f2) ⊧ ⊥.
Lemma tableau_nonimplique : ∀ F f1 f2, f1 ∧ ¬f2 ∧ F ⊧ ⊥ → ¬(f1 ⇒ f2) ∧ F ⊧ ⊥.
Lemma tableau_nonimplique´ : ∀ f1 f2, f1 ∧ ¬f2 ⊧ ⊥ → ¬(f1 ⇒ f2) ⊧ ⊥.
Lemma tableau_nonOu : ∀ F f1 f2, ¬f1 ∧ ¬f2 ∧ F ⊧ ⊥ → ¬(f1 ∨ f2) ∧ F ⊧ ⊥.
Lemma tableau_nonOu´ : ∀ f1 f2, ¬f1 ∧ ¬f2 ⊧ ⊥ → ¬(f1 ∨ f2) ⊧ ⊥.
Lemma tableau_ferme_branche : ∀ F f, (F ∧ f) ∧ ¬f ⊧ ⊥.
Lemma tableau_ferme_branche´ : ∀ F f, f ∧ ¬f ∧ F ⊧ ⊥.
Lemma tableau_ferme_branche´´ : ∀ F f, (f ∧ ¬f) ∧ F ⊧ ⊥.
Lemma tableau_ferme_branche´´´ : ∀ f, f ∧ ¬f ⊧ ⊥.
Lemma p_et_p_eq : ∀ a, a∧a ≡ a.
Les règles pour les quantificateurs
Notions de variables (de terme) fraîches, liées etc.
Inductive is_fresh_terme_list (i:nat): list terme → Prop :=
| isFreshTrmNil : is_fresh_terme_list i nil
| isFreshTrmCons : ∀ j l, is_fresh_terme_list i l → i≠j
→ is_fresh_terme_list i (TVar j::l).
Une variable de terme i est fraîche dans la formule φ si elle
n'apparaît nulle part dans φ.
Inductive is_fresh i: formule → Prop :=
| isFreetrue: is_fresh i ⊤
| isFreefalse: is_fresh i ⊥
| isFreeV: ∀ j, is_fresh i (Var j)
| isFreeNon: ∀ φ, is_fresh i φ → is_fresh i (¬φ)
| isFreeEt: ∀ φ ψ, is_fresh i φ →is_fresh i ψ → is_fresh i (φ∧ψ)
| isFreeOr: ∀ φ ψ, is_fresh i φ → is_fresh i ψ → is_fresh i (φ∨ψ)
| isFreeImplique: ∀ φ ψ, is_fresh i φ → is_fresh i ψ → is_fresh i (φ ⇒ ψ)
| isFreePred: ∀ p lt, is_fresh_terme_list i lt → is_fresh i (Pred p lt)
| isFreeFORALL: ∀ j φ, is_fresh i φ → i≠j → is_fresh i (FORALL j φ)
| isFreeEXIST: ∀ j φ, is_fresh i φ → i≠j → is_fresh i (EXIST j φ).
| isFreetrue: is_fresh i ⊤
| isFreefalse: is_fresh i ⊥
| isFreeV: ∀ j, is_fresh i (Var j)
| isFreeNon: ∀ φ, is_fresh i φ → is_fresh i (¬φ)
| isFreeEt: ∀ φ ψ, is_fresh i φ →is_fresh i ψ → is_fresh i (φ∧ψ)
| isFreeOr: ∀ φ ψ, is_fresh i φ → is_fresh i ψ → is_fresh i (φ∨ψ)
| isFreeImplique: ∀ φ ψ, is_fresh i φ → is_fresh i ψ → is_fresh i (φ ⇒ ψ)
| isFreePred: ∀ p lt, is_fresh_terme_list i lt → is_fresh i (Pred p lt)
| isFreeFORALL: ∀ j φ, is_fresh i φ → i≠j → is_fresh i (FORALL j φ)
| isFreeEXIST: ∀ j φ, is_fresh i φ → i≠j → is_fresh i (EXIST j φ).
Une variable i est non-liée dans une formule φ si elle n'a pas
d'occurrence dans un quantificateur.
Inductive is_not_bound i: formule → Prop :=
| isNotBoundtrue: is_not_bound i ⊤
| isNotBoundfalse: is_not_bound i ⊥
| isNotBoundV: ∀ j, is_not_bound i (Var j)
| isNotBoundNon: ∀ φ, is_not_bound i φ → is_not_bound i (¬φ)
| isNotBoundEt: ∀ φ ψ, is_not_bound i φ →is_not_bound i ψ → is_not_bound i (φ∧ψ)
| isNotBoundOr: ∀ φ ψ, is_not_bound i φ → is_not_bound i ψ → is_not_bound i (φ∨ψ)
| isNotBoundImplique: ∀ φ ψ, is_not_bound i φ
→ is_not_bound i ψ → is_not_bound i (φ ⇒ ψ)
| isNotBoundPred: ∀ p lt, is_not_bound i (Pred p lt)
| isNotBoundFORALL: ∀ j φ, is_not_bound i φ → i≠j → is_not_bound i (FORALL j φ)
| isNotBoundEXIST: ∀ j φ, is_not_bound i φ → i≠j → is_not_bound i (EXIST j φ).
| isNotBoundtrue: is_not_bound i ⊤
| isNotBoundfalse: is_not_bound i ⊥
| isNotBoundV: ∀ j, is_not_bound i (Var j)
| isNotBoundNon: ∀ φ, is_not_bound i φ → is_not_bound i (¬φ)
| isNotBoundEt: ∀ φ ψ, is_not_bound i φ →is_not_bound i ψ → is_not_bound i (φ∧ψ)
| isNotBoundOr: ∀ φ ψ, is_not_bound i φ → is_not_bound i ψ → is_not_bound i (φ∨ψ)
| isNotBoundImplique: ∀ φ ψ, is_not_bound i φ
→ is_not_bound i ψ → is_not_bound i (φ ⇒ ψ)
| isNotBoundPred: ∀ p lt, is_not_bound i (Pred p lt)
| isNotBoundFORALL: ∀ j φ, is_not_bound i φ → i≠j → is_not_bound i (FORALL j φ)
| isNotBoundEXIST: ∀ j φ, is_not_bound i φ → i≠j → is_not_bound i (EXIST j φ).
Une variable fraîche est également non-liée
On peut changer l'interprétation d'une variable fraîche sans
changer l'interprétation (puisqu'elle n'appraît pas dans la
formule).
Substitution de variable dans une formule
Function substtermvar (n:nat) (v:nat) (fr:formule) {struct fr}: formule :=
match fr with
⊤ ⇒ ⊤
| ⊥ ⇒ ⊥
| Var x ⇒ Var x
| Non x ⇒ Non (substtermvar n v x)
| Ou x x0 ⇒ Ou (substtermvar n v x) (substtermvar n v x0)
| Et x x0 ⇒ Et (substtermvar n v x) (substtermvar n v x0)
| Implique x x0 ⇒ Implique (substtermvar n v x) (substtermvar n v x0)
| (Pred i l) ⇒
Pred i (List.map (fun trm´ ⇒
let ´(TVar v´) := trm´ in
if beq_nat v´ n then TVar v else TVar v´) l)
| FORALL i fr´ ⇒ if beq_nat n i || beq_nat v i then fr else FORALL i (substtermvar n v fr´)
| EXIST i fr´ ⇒ if beq_nat n i || beq_nat v i then fr else EXIST i (substtermvar n v fr´)
end.
Notation "f [ i <= trm ]" := (substtermvar i trm f) (at level 85).
Eval compute in (substtermvar 1 2 (p1[x1,x1,x3])).
Eval compute in (substtermvar 1 2 (p1[x2,x1,x3])).
Eval compute in (substtermvar 1 2 (∀x1 p1[x1,x1,x3])).
Eval compute in (substtermvar 1 3 ((∀x1 p1[x1,x1,x3]) ∨ ∃x3 p1[x1,x1,x3])).
Eval compute in (substtermvar 1 2 ((∀x1 p1[x1,x1,x3]) ∨ ∃x3 p1[x1,x1,x3])).
Eval compute in (substtermvar 1 2 ((∀x1 p1[x1,x1,x3]) ∨ ∀x3 p1[x1,x1,x3])).
Lemma subst_substterm_pred:
∀ n l i v var b,
(v [substtermvar i var (Pred n l)]-> b)
↔ (subst_in_interp v i (vterme v (TVar var)) [Pred n l]-> b).
Lemma substinterp_substvar_eq:
∀ i v φ var b (hfreshv:is_not_bound var φ) (hfreshi:is_not_bound i φ),
((v [substtermvar i var φ]-> b) ↔ (subst_in_interp v i (v.(vterme) (TVar var)) [φ]-> b)).
Lemma tableau_forall :
∀ F f1 i var,
is_not_bound var f1
→ is_not_bound i f1
→ substtermvar i var f1 ∧ (FORALL i f1) ∧ F ⊧ ⊥
→ (FORALL i f1) ∧ F ⊧ ⊥.
Lemma tableau_exist:
∀ F f1 i j,
is_fresh j f1
→ is_not_bound i f1
→ is_fresh j F
→ substtermvar i j f1 ∧ F ⊧ ⊥
→ EXIST i f1 ∧ F ⊧ ⊥.
Lemma tableau_exist´:
∀ f1 i j,
is_fresh j f1
→ is_not_bound i f1
→ substtermvar i j f1 ⊧ ⊥
→ EXIST i f1 ⊧ ⊥.
Module Exemple_Tableaux.
Lemma conseq1: (X1∨¬X2) ∧ X2 ⊧ X1.
Proof.
apply conseq_by_contradiction.
do_Ou X1 (¬X2).
- do_ferme X1.
- do_ferme X2.
Qed.
Lemma conseq1´: (X1∨¬(p1[x1])) ∧ p1[x1] ⊧ X1.
Proof.
apply conseq_by_contradiction.
do_Ou X1 (¬p1[x1]).
- do_ferme X1.
- do_ferme (p1[x1]).
Qed.
Lemma conseq1´´´´: (∃x1 ((X1∨¬(p1[x1])) ∧ p1[x1])) ⊧ X1.
Proof.
apply conseq_by_contradiction.
do_exist (∃x1((X1 ∨ ¬p1[x1]) ∧ p1[x1])) 9.
do_Et ((X1 ∨ ¬p1 [x9]))(p1 [x9]).
do_Ou X1 (¬p1[x9]).
- do_ferme X1.
- do_ferme (p1[x9]).
Qed.
Lemma conseq1´´´: p1[x3] ∧ (∃x1 ((X1∨¬(p1[x1])) ∧ p1[x1])) ⊧ X1.
Proof.
apply conseq_by_contradiction.
do_exist (∃x1((X1 ∨ ¬p1 [x1]) ∧ p1 [x1])) 9.
do_Et ((X1 ∨ ¬p1 [x9]))(p1 [x9]).
do_Ou X1 (¬p1[x9]).
- do_ferme X1.
- do_ferme (p1[x9]).
Qed.
Lemma conseq1´´: (X1∨¬(p1[x1])) ∧ (∀x1 p1[x1]) ⊧ X1.
Proof.
apply conseq_by_contradiction.
do_Ou X1 (¬p1[x1]).
- do_ferme X1.
- do_Forall (∀x1(p1 [x1])) 1.
do_ferme (p1[x1]).
Qed.
Lemma foralneg: (¬∀x1 p1[x1]) ⊧ ∃x2 ¬p1[x2].
Proof.
apply conseq_by_contradiction.
rewrite eq_not_exist.
do_exist (∃x1 ¬(p1 [x1])) 3.
rewrite eq_not_forall.
do_Forall (∀x2(¬(¬p1[x2]))) 3.
do_ferme (¬p1[x3]).
Qed.
Lemma existneg: (¬∃x1 p1[x1]) ⊧ ∀x2 ¬p1[x2].
Proof.
apply conseq_by_contradiction.
rewrite eq_not_exist.
do_exist (∃x2 (¬(¬(p1 [x2])))) 3.
rewrite eq_not_forall.
do_Forall (∀x1(¬p1[x1])) 3.
do_ferme (¬p1[x3]).
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 conseq5´ : (¬ ((p2((TVar 1::nil)) ) ∧ X2)) ∧ (p2((TVar 1::nil)) ) ∧ X2 ⊧ ⊥.
Proof.
do_nonEt (p2((TVar 1::nil)) ) X2.
- do_ferme (p2((TVar 1::nil)) ).
- do_ferme X2.
Qed.
Lemma conseq6 : (X1 ∧ (p2((TVar 1::nil)) ) ) ∧ (¬X1 ∨ X2) ⊧ ⊥.
Proof.
do_Ou (¬X1) X2.
- do_ferme X1.
-
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 conseq5´ : (¬ ((p2((TVar 1::nil)) ) ∧ X2)) ∧ (p2((TVar 1::nil)) ) ∧ X2 ⊧ ⊥.
Proof.
do_nonEt (p2((TVar 1::nil)) ) X2.
- do_ferme (p2((TVar 1::nil)) ).
- do_ferme X2.
Qed.
Lemma conseq6 : (X1 ∧ (p2((TVar 1::nil)) ) ) ∧ (¬X1 ∨ X2) ⊧ ⊥.
Proof.
do_Ou (¬X1) X2.
- do_ferme X1.
-
Echec
Abort.
End Exemple_Tableaux.
Print Assumptions tableau_forall.
Print Assumptions tableau_exist.
Print Assumptions interp_def_tot.
End Exemple_Tableaux.
Print Assumptions tableau_forall.
Print Assumptions tableau_exist.
Print Assumptions interp_def_tot.
This page has been generated by coqdoc