Creative Commons License Copyright Pierre Courtieu et Olivier Pons. This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International public License.

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

Les termes ne sont que des variables. La logique propositionnelle inclut en principe les symboles de fonctions mais cela compliquerait la présentation.

Inductive terme: Type :=
| TVar: terme.

Exemples de termes


Check (TVar 7).
: terme

Les formules

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.

Inductive formule : Type :=
| Vrai: formule
| Faux: formule
| Var: formule
| Non: formuleformule
| Ou: formuleformuleformule
| Et: formuleformuleformule
| Implique: formuleformuleformule
| Pred: list termeformule
| FORALL: formuleformule
| EXIST: formuleformule.

Exemples de formules

Check (Pred 1 (TVar 1::nil)).
: 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)).

Notations usuelles pour les formules.



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).


Exemples avec et sans notations:


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 (x1x2 p1 [x1 , x2 , x3]).

termes:


Check (TVar 7).
Check x7.

Scheme Equality for terme.

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 qbeq_nat p q
    | φ1 φ2, ψ1 ψ2formule_beq φ1 ψ1 && formule_beq φ2 ψ2
    | φ1 φ21 ψ2formule_beq φ1 ψ1 && formule_beq φ2 ψ2
    | φ1 φ21 ψ2formule_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 : termeterme_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} + {f1f2}.

Définition de l'interprétation d'une formule

Valuation

Pour interpréter une formule on a besoin des éléments suivants:
  • 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.
    Par ailleurs on aura besoin de s'assurer que le domaine d'interprétation des termes est non vide, on se donne donc un témoin.

Record Valuation {D:Type} :=
  { vpredicat: nat → (list Dbool);
    vterme: termeD;
    vproposition: natbool;
    temoin:D }.

Substitution dans la valuation des termes

Ajout (où modification) de la valeur d'une variable dans une interprétation. Utile pour l'interprétation des quantificateurs. On se place dans Z pour écrire la fonction.

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

La sémantique ne peut plus se définir comme une fonction car elle ne peut pas être le résultat d'un calcul (comment calculer la valeur de ∀x∈ℕ,P(x) si le domaine de x est infini).
On définit donc l'interprétation comme une relation entre une formule, une interprétation et un booléen. On prouvera plus bas que cette relation est "fonctionnelle" en utilisant le tiers-exclu. Par ailleurs on prend Z comme domaine d'interprétation des termes mais cette définition est valable pour n'importe quel ensemble non vide.

Inductive interp_def (I:@Valuation Z): formuleboolProp :=
| I_Vrai: interp_def I table_Vrai
| I_Faux: interp_def I table_Faux
| I_Var: i b, I.(vproposition) i = binterp_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.

Notation "I [ f ]-> b" := (interp_def I f b) (at level 50).


Déterminisme et totalité de l'interprétation d'une formule.

Pour les logique précédente ces deux propriétés étaient des conséquences du fait que l'interprétation était définie par une fonction. Maintenant que l'interprétation est une relation il faut démontrer que cette relation correspond en fa it à une fonction (non calculable).

Lemma interp_def_det :
   f1 interp b1,
    interp_def interp f1 b1
    → b2, interp_def interp f1 b2b1 = b2.


Ceci introduit l'axiome suivant: P : Prop, P ¬ P.

Require Import Classical.

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.

Lemma interp_def_tot :
   f1 interp,
    interp_def interp f1 true interp_def interp f1 false.

Corollaire du déterminisme + totalité de l'interpétation.

Lemma interp_not_true :
   f1 interp,
    ¬ interp_def interp f1 true interp_def interp f1 false.


Exemples d'interprétations


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 Zbool) :=
    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

On applique les définitions de conséquence, modèle etc du chapitre logique_generique avec les notions de valuation et d'interprétation ci-dessous.
l'interprétation n'est pas nécessairement décidable. En effet l'ensemble sur lequel sont quantifiées les variables peut être infini.


  Definition valuation: Type:= @Valuation Z.
  Definition interpretation: valuationformuleboolProp := 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.

Preuves d'équivalences entre formules


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).


Preuve par réfutation (Utile pour la preuve par tableau plus loin).

Pour prouver f ⊧ g on peut prouver f ∧ ¬g ⊧ ⊥ .

Lemma conseq_by_contradiction: f1 f2: formule, ¬f2 f1 f1 f2.

Preuve par la méthode des tableaux

Lemmes auxilaires pour la méthode des tableaux


Lemma and_affaiblissement_conseq : v f1 f2, v[f1f2]->truev[f1]->true.

Lemma and_affaiblissement_contr : f1 f2, f1 f1f2 .

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 ) ⇒
      if formule_beq f g then Some
      else
        if formule_beq f then Some g
        else
          match extraction_disjuntion f with
              NoneNone
            | Some F´´Some (g F´´)
          end
    | gif 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 , extraction_disjuntion f F = Some → (F f ).

Les règles des tableaux


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, aa a.

Les règles pour les quantificateurs

Ces règles sont plus compliquées à exprimer et à démontrer car elle font appelle à la notion de variables liées, libre et fraîches. On commence par définir ces notions et leur propriétés, puis on énonce les règles pour les quantificateurs.

Notions de variables (de terme) fraîches, liées etc.


Inductive is_fresh_terme_list (i:nat): list termeProp :=
| isFreshTrmNil : is_fresh_terme_list i nil
| isFreshTrmCons : j l, is_fresh_terme_list i lij
                               → 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: formuleProp :=
| 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 ltis_fresh i (Pred p lt)
| isFreeFORALL: j φ, is_fresh i φijis_fresh i (FORALL j φ)
| isFreeEXIST: j φ, is_fresh i φijis_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: formuleProp :=
| 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 φijis_not_bound i (FORALL j φ)
| isNotBoundEXIST: j φ, is_not_bound i φijis_not_bound i (EXIST j φ).

Une variable fraîche est également non-liée

Lemma fresh_is_not_bound : φ i, is_fresh i φis_not_bound i φ.


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).

Lemma subst_fresh_id: i φ,
                        is_fresh i φ
                        → b v x, (subst_in_interp v i x) [φ]-> b
                                          v [φ]-> b.

Substitution de variable dans une formule

On se donne une opération de substitution de variable par un terme dans une formule.

Function substtermvar (n:nat) (v:nat) (fr:formule) {struct fr}: formule :=
  match fr with
      
    |
    | Var xVar x
    | Non xNon (substtermvar n v x)
    | Ou x x0Ou (substtermvar n v x) (substtermvar n v x0)
    | Et x x0Et (substtermvar n v x) (substtermvar n v x0)
    | Implique x x0Implique (substtermvar n v x) (substtermvar n v x0)
    | (Pred i l) ⇒
      Pred i (List.map (fun trm´
                          let ´(TVar ) := trm´ in
                          if beq_nat n then TVar v else TVar ) 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 .

Exemples d'application des tableaux.


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.
    -
Echec
  Abort.

End Exemple_Tableaux.

Print Assumptions tableau_forall.
Print Assumptions tableau_exist.
Print Assumptions interp_def_tot.


This page has been generated by coqdoc