Library PropcL

Require Export PropiL.

Classical Natural Deduction


Inductive ndc : context form Prop :=
  | ndcA A s: s el A ndc A s
  | ndcC A s: ndc (Not s :: A) Fal ndc A s
  | ndcII A s t: ndc (s::A) t ndc A (Imp s t)
  | ndcIE A s t: ndc A (Imp s t) ndc A s ndc A t
  | ndcAI A s t: ndc A s ndc A t ndc A (And s t)
  | ndcAE A s t u: ndc A (And s t) ndc (s::t::A) u ndc A u
  | ndcOIL A s t: ndc A s ndc A (Or s t)
  | ndcOIR A s t: ndc A t ndc A (Or s t)
  | ndcOE A s t u: ndc A (Or s t) ndc (s::A) u ndc (t::A) u ndc A u.

Hint Constructors ndc.

Lemma ndc_refl: Reflexivity ndc.

Lemma ndc_mono: Monotonicity ndc.

Lemma ndcW1 A s t: ndc A s ndc (t::A) s.

Lemma ndcW A B s: ndc A s A <<= B ndc B s.

Lemma ndcE A s: ndc A Fal ndc A s.

Lemma ndc_cut: Cut ndc.

(* Lemma ndc_cons: Consistency nd. --- based on bent/genc *)

Lemma ndc_imp: CharImp ndc.

Lemma ndc_fal: CharFal ndc.

Lemma ndc_and: CharAnd ndc.

Lemma ndc_or: CharOr ndc.

Lemma ndc_subst: Substitution ndc.

Lemma nd_ndc A s: nd A s ndc A s.

Lemma ndDN A s: nd A s nd A (Not (Not s)).

Lemma Glivenko A s: ndc A s nd A (Not (Not s)).

Corollary Glivenko_refute A: nd A Fal ndc A Fal.

Lemma ndc_refute A s: ndc A s ndc (Not s :: A) Fal.

Corollary nd_embeds_ndc A s: ndc A s nd (Not s :: A) Fal.

Boolean Entailment

Assignments and Satisfaction

Definition assn := var bool.

Fixpoint satis (f : assn) (s : form) : Prop :=
  match s with
    | Var xif f x then True else False
    | FalFalse
    | Imp s1 s2satis f s1 satis f s2
    | And s1 s2satis f s1 satis f s2
    | Or s1 s2satis f s1 satis f s2
  end.

Instance satis_dec : f s, dec (satis f s).

Fixpoint eval alpha s : bool :=
  match s with
    | Var xalpha x
    | Falfalse
    | Imp s tif eval alpha s then eval alpha t else true
    | And s tif eval alpha s then eval alpha t else false
    | Or s tif eval alpha s then true else eval alpha t
  end.

Lemma satis_eval alpha s :
  satis alpha s eval alpha s = true.

Lemma satis_pos_imp alpha s t :
  satis alpha (Imp s t) ¬ satis alpha s satis alpha t.

Lemma satis_neg_imp alpha s t :
  ¬ satis alpha (Imp s t) satis alpha s ¬ satis alpha t.

Lemma satis_pos_and alpha s t :
  satis alpha (And s t) satis alpha s satis alpha t.

Lemma satis_neg_and alpha s t :
  ¬ satis alpha (And s t) ¬ satis alpha s ¬ satis alpha t.

Lemma satis_pos_or alpha s t :
  satis alpha (Or s t) satis alpha s satis alpha t.

Lemma satis_neg_or alpha s t :
  ¬ satis alpha (Or s t) ¬ satis alpha s ¬ satis alpha t.

Validity and boolean entailment

Definition valid s : Prop :=
   alpha, satis alpha s.

Lemma valid_unsat s :
  valid s ¬ alpha, satis alpha (Not s).

Definition bent A s : Prop :=
   alpha, ( t, t el A satis alpha t) satis alpha s.

Lemma ndc_bent A s: ndc A s bent A s.

Lemma ndc_cons: Consistency ndc.

Lemma ndc_EntailRelation: EntailRelAllProps ndc.

Implicit Types x y z : var.
Implicit Types s t : form.
Implicit Types alpha beta : assn.
Implicit Types A B : context.
Implicit Types m n k : nat.
Implicit Types S T : sform.
Implicit Types C D : clause.

Fixpoint satis' alpha C : Prop :=
  match C with
    | nilTrue
    | T::C'satis alpha (uns T) satis' alpha C'
  end.

Definition sat C := alpha, satis' alpha C.

Lemma satis_iff alpha C :
  satis' alpha C S, S el C satis alpha (uns S).

Lemma satis_in alpha C S :
  satis' alpha C S el C satis alpha (uns S).

Lemma satis_weak alpha C C' :
  C <<= C' satis' alpha C' satis' alpha C.

Lemma sat_weak C C' :
  C <<= C' sat C' sat C.

Entailment of clauses

Definition cent C D : Prop :=
   alpha, satis' alpha C satis' alpha D.

Lemma cent_weak C D D' :
  D <<= D' cent C D' cent C D.

Lemma cent_sat C D :
  cent C D sat C sat D.

Solved Clauses

Definition svar S : Prop :=
  match S with
    | +Var _ | -Var _True
    | _False
  end.

Definition solved C : Prop :=
  ( S, S el C svar S) x, +Var x el C ¬ -Var x el C.

Definition phi C x := if decision (+Var x el C) then true else false.

Lemma solved_phi C :
  solved C satis' (phi C) C.

Lemma solved_sat C: solved C sat C.

Lemma solved_sat' C: solved C { alpha | satis' alpha C }.

Lemma solved_nil :
  solved nil.

Lemma solved_pos_var x C :
  solved C ¬ -Var x el C solved (+Var x :: C).

Lemma solved_neg_var x C :
  solved C ¬ +Var x el C solved (-Var x :: C).

Lemma cent_solved_sat C D :
  cent C D solved C sat D.

Refutation predicates


Record ref_pred (rho : clause Prop) :=
  { ref_Fal: C, +Fal el C rho C;
    ref_weak: C C', C <<= C' rho C rho C';
    ref_clash: x C, +Var x el C -Var x el C rho C;
    ref_pos_imp: s t C, rho (-s::C) rho (+t::C) rho (+Imp s t::C);
    ref_neg_imp: s t C, rho (+s::-t::C) rho (-Imp s t::C);
    ref_pos_and: s t C, rho (+s::+t::C) rho (+And s t::C);
    ref_neg_and: s t C, rho (-s::C) rho (-t::C) rho (-And s t::C);
    ref_pos_or: s t C, rho (+s::C) rho (+t::C) rho (+Or s t::C);
    ref_neg_or: s t C, rho (-s::-t::C) rho (-Or s t::C);
    ref_sound: C, rho C ¬ sat C }.

Lemma ref_unsat :
  ref_pred (fun C¬ sat C).

Lemma ref_ndc :
  ref_pred (fun Cndc (map uns C) Fal).

Decision trees


Inductive rec C : clause Type :=
  | recNil : rec C nil
  | recPF D : rec C (+Fal :: D)
  | recNF D : rec C D rec C (-Fal ::D)
  | recPV D x : -Var x el C rec C (+Var x :: D)
  | recPV' D x : ¬ -Var x el C rec (+Var x :: C) D rec C (+Var x :: D)
  | recNV D x : +Var x el C rec C (-Var x :: D)
  | recNV' D x : ¬ +Var x el C rec (-Var x :: C) D rec C (-Var x :: D)
  | recPI D s t : rec C (-s :: D) rec C (+t :: D) rec C (+Imp s t :: D)
  | recNI D s t : rec C (+s :: -t :: D) rec C (-Imp s t :: D)
  | recPA D s t : rec C (+s :: +t :: D) rec C (+And s t :: D)
  | recNA D s t : rec C (-s :: D) rec C (-t :: D) rec C (-And s t :: D)
  | recPO D s t : rec C (+s :: D) rec C (+t :: D) rec C (+Or s t :: D)
  | recNO D s t : rec C (-s :: -t :: D) rec C (-Or s t :: D).

Definition provider C D : rec C D.

Definition DNF Cs: list clause :=
  (fix F {C D: clause} (r: rec C D): list clause :=
    match r with
    | @recNil _[C]
    | @recPF _ _[]
    | @recNF _ _ RF R
    | @recPV _ _ _ _[]
    | @recPV' _ _ _ _ RF R
    | @recNV _ _ _ _[]
    | @recNV' _ _ _ _ RF R
    | @recPI _ _ _ _ R1 R2(F R1) ++ (F R2)
    | @recNI _ _ _ _ RF R
    | @recPA _ _ _ _ RF R
    | @recNA _ _ _ _ R1 R2(F R1) ++ (F R2)
    | @recPO _ _ _ _ R1 R2(F R1) ++ (F R2)
    | @recNO _ _ _ _ RF R
    end
  ) [] Cs (provider [] Cs).

(* Compute DNF + Imp (Var 0) (Imp (Var 1) (Var 0)). *)

Refutation lemma


Section RL.
  Variable rho : clause Prop.
  Variable Rho : ref_pred rho.

  Definition decider C D :
    rec C D solved C
    {E | solved E cent E (D ++ C)} + {rho (D ++ C)}.

  Lemma solved_ref C :
    {D| solved D cent D C} + {rho C}.

  Lemma refutation C :
    {sat C} + {rho C}.

  Lemma ref_iff_unsat C :
    rho C ¬ sat C.

  Lemma ref_dec C :
    dec (rho C).

End RL.

Decidability of classical ND entailment


Lemma satis_pos f A :
  satis' f (map Pos A) s, s el A satis f s.

Theorem ndc_dec_bent A s :
  dec (ndc A s).

(* Recursive Extraction ndc_dec_bent. *)

Agreement of classical ND entailment with boolean entailment


Lemma bent_iff_unsat A s :
  bent A s ¬ sat (-s :: map Pos A).

Theorem ndc_iff_sem A s:
  ndc A s bent A s.

Classical Gentzen system

GK3c system
Inductive gk3c: context context Prop :=
  | gk3cC A B x: Var x el A Var x el B gk3c A B
  | gk3cF A B: Fal el A gk3c A B
  | gk3cIL A B s t: Imp s t el A gk3c A (s::B) gk3c (t::A) B gk3c A B
  | gk3cIR A B s t: Imp s t el B gk3c (s::A) (t::B) gk3c A B
  | gk3cAL A B s t: And s t el A gk3c (s::t::A) B gk3c A B
  | gk3cAR A B s t: And s t el B gk3c A (s::B) gk3c A (t::B) gk3c A B
  | gk3cOL A B s t: Or s t el A gk3c (s::A) B gk3c (t::A) B gk3c A B
  | gk3cOR A B s t: Or s t el B gk3c A (s::t::B) gk3c A B.

Hint Constructors gk3c.

Lemma gk3cA A B s: s el A s el B gk3c A B.

Hint Resolve gk3cA.

Lemma gk3cLW A B: gk3c A B A', A <<= A' gk3c A' B.

Lemma gk3cRW A B: gk3c A B B', B <<= B' gk3c A B'.

Lemma gk3cW A B A' B': gk3c A B A <<= A' B <<= B' gk3c A' B'.

Contraction Rules admissible
Lemma gk3cLC A B s: gk3c (s::s::A) B gk3c (s::A) B.

Lemma gk3cRC A B s: gk3c A (s::s::B) gk3c A (s::B).

(*
  Troelstra & Schwichtenberg proved weakening, inversion lemmas,
  and contraction with maximum depth n of derivation trees.
  Here we have not formalized that.
*)


(* Contradiction Rules *)
Lemma gk3cFL A B s: gk3c A (s::B) gk3c (Not s::A) B.

Lemma gk3cFR A B s: gk3c (s::A) B gk3c A (Not s::B).

Lemma gk3cDNR A B s: gk3c A (s::B) gk3c A (Not (Not s)::B).

Lemma gk3cDNL A B s: gk3c (s::A) B gk3c (Not (Not s)::A) B.

Lemma gk3c_emptyR A: ¬ gk3c A [Fal] ¬ gk3c A [].

Lemma gk3cTF' A B: A === [Imp Fal Fal] B === [Fal] ¬ gk3c A B.

Lemma gk3cTF: ¬gk3c [Imp Fal Fal] [Fal].

Lemma gk3c_NF': ¬ gk3c [] [Fal].

Lemma gk3c_NF1 B: B === [Fal] ¬ gk3c [] B.

Lemma gk3c_NF: ¬ gk3c [] [Fal].

Lemma gk3c_con: ¬ gk3c [] [].

Lemma gk3c_NV' B x: B === [Var x] ¬ gk3c [] B.

Lemma gk3c_NV x: ¬ gk3c [] [Var x].

Equivalence between GK3c and Nc


(* From GK3c to Nc *)

Fixpoint neg (B: context): context :=
  match B with
   | [][]
   | s :: B'Not s :: neg B'
  end.

Lemma neg_in B s: s el B Not s el neg B.

Lemma neg_incl B B': B <<= B' neg B <<= neg B'.

Lemma gk3c_ndcG A B:
  gk3c A B ndc (A ++ neg B) Fal.

Lemma gk3c_ndc A s:
  gk3c A [s] ndc A s.

Assumming Cut
Definition gk3cCut: Prop :=
   A B A' B' s, gk3c A (s::B) gk3c (s::A') B' gk3c (A++A') (B++B').

Section gk3c_Cut.
  Implicit Type Cut: gk3cCut.

  (* Explosion Rule or Falsity Characterization *)
  Lemma gk3cCutE Cut A B: gk3c A [Fal] gk3c A B.

  Lemma gk3cFL_invCut Cut A B s:
    gk3c (Not s::A) B gk3c A (s::B).

  Lemma gk3cFR_invCut Cut A B s:
    gk3c A (Not s::B) gk3c (s::A) B.

  Lemma gk3cDNR_invCut Cut A B s:
    gk3c A (Not (Not s)::B) gk3c A (s::B).

  Lemma gk3cDNL_invCut Cut A B s:
    gk3c (Not (Not s)::A) B gk3c (s::A) B.

  Example gk3c_Peirce_Cut Cut s t: gk3c [] [(Imp (Imp (Imp s t) s) s)].

  (* Equivalence with natural deduction, assuming Cut *)
  Lemma ndc_gk3cCut Cut A s:
    ndc A s gk3c A [s].

  Theorem gk3cCut_iff_ndc Cut A s:
    gk3c A [s] ndc A s.

End gk3c_Cut.

Cut elimination in GK3c


Proposition gk3c_GCut_Var A B x:
  gk3c A B
   A' B' : context, gk3c A' B'
    gk3c (A ++ rem A' (Var x)) (rem B (Var x) ++ B').

Proposition gk3c_GCut_Fal A B:
  gk3c A B
   A' B' : context, gk3c A' B'
    gk3c (A ++ rem A' Fal) (rem B Fal ++ B').

Lemma gk3c_GCut A B A' B' s:
  gk3c A B gk3c A' B' gk3c (A ++ rem A' s) (rem B s ++ B').

Theorem gk3c_Cut: gk3cCut.

Lemmas transferred to the cut-free system

Lemma gk3cE A B: gk3c A [Fal] gk3c A B.

Lemma gk3cFL_inv A B s:
  gk3c (Not s::A) B gk3c A (s::B).

Lemma gk3cFR_inv A B s:
  gk3c A (Not s::B) gk3c (s::A) B.

Lemma gk3cFL_iff A B s:
   gk3c (Not s::A) B gk3c A (s::B).

Lemma gk3cFR_iff A B s:
  gk3c A (Not s::B) gk3c (s::A) B.

Lemma gk3cDNR_inv A B s:
  gk3c A (Not (Not s)::B) gk3c A (s::B).

Lemma gk3cDNL_inv A B s:
  gk3c (Not (Not s)::A) B gk3c (s::A) B.

Lemma gk3cDNR_iff A B s:
  gk3c A (Not (Not s)::B) gk3c A (s::B).

Lemma gk3cDNL_iff A B s:
  gk3c (Not (Not s)::A) B gk3c (s::A) B.

(* Equivalence with natural deduction, cut-free *)
Lemma ndc_gk3c A s:
  ndc A s gk3c A [s].

Theorem gk3c_iff_ndc A s:
  gk3c A [s] ndc A s.

(* Implication free formulas are equivalently derivable *)
Definition ImpFreeA A := s, s el A ImpFree s.

Lemma gk3c_tab_ImpFreeG B:
  ImpFreeA B gk3c [] B tab [] B.

Lemma nd_ndc_ImpFree s:
  ImpFree s (ndc [] s nd [] s).

Section ssL_nd_ndc.
  Lemma gk3c_tab_NegImpFreeG B:
    (¬ S, match S with | -(Imp _ _)True | _False end
                 S el ssL (map Neg B))
     gk3c [] B tab [] B.

  Lemma gk3c_tab_NegImpFree s:
    (¬ S, match S with | -(Imp _ _)True | _False end
                 S el ssL [-s])
     gk3c [] [s] tab [] [s].

  Lemma nd_ndc_NegImpFree s:
    (¬ S, match S with | -(Imp _ _)True | _False end
                 S el ssL [-s])
     (ndc [] s nd [] s).

End ssL_nd_ndc.

Decidability of GK3c

Definition goalc := prod context context.

Instance goalc_eq_dec (gamma delta: goalc) :
  dec (gamma = delta).

Section Decidability_GK3c.
  Variable A0 B0 : context.
  Definition Uc := scl (A0 ++ B0).
  Definition Uc_sfc : sf_closed Uc := @scl_closed _.
  Definition Gammac := list_prod (power Uc) (power Uc).

  Definition stepc (Delta : list goalc) (gamma : goalc) : Prop :=
    let (A,B) := gamma in
    ( u, u el A (u el B
       match u with
        | FalTrue
        | Imp s t(A, rep (s::B) Uc) el Delta (rep (t::A) Uc, B) el Delta
        | And s t(rep (s::t::A) Uc, B) el Delta
        | Or s t(rep (s::A) Uc, B) el Delta (rep (t::A) Uc, B) el Delta
        | _False
       end))
    
    ( u, u el B
       match u with
        | Imp s t(rep (s::A) Uc, rep (t::B) Uc) el Delta
        | And s t(A, rep (s::B) Uc) el Delta (A, rep (t::B) Uc) el Delta
        | Or s t(A, rep (s::t::B) Uc) el Delta
        | _False
       end).

  Instance stepc_dec Delta gamma :
    dec (stepc Delta gamma).

  Definition Lambdac : list goalc :=
    FCI.C (step := stepc) Gammac.

  Lemma lambdac_closure gamma :
    gamma el Gammac stepc Lambdac gamma gamma el Lambdac.

  Lemma lambdac_ind (p : goalc Prop) :
    ( Delta gamma, inclp Delta p
      gamma el Gammac stepc Delta gamma p gamma)
     inclp Lambdac p.

  Lemma gk3c_lambdac A B :
    A <<= Uc B <<= Uc gk3c A B (rep A Uc, rep B Uc) el Lambdac.

  Lemma lambdac_gk3c A B :
    (A,B) el Lambdac gk3c A B.

  Theorem gk3c_dec: dec (gk3c A0 B0).

End Decidability_GK3c.

Theorem ndc_dec_gk3c A s: dec (ndc A s).

Lemma gk3c_bentG A B:
  gk3c A B bent (A ++ neg B) Fal.

Lemma gk3c_bent A s :
  gk3c A [s] bent A s.

Lemma ref_gk3c:
  ref_pred (fun Cgk3c (map uns C) []).

Lemma gk3c_refute A B:
  gk3c A B gk3c (A ++ neg B) [].

Lemma uns_neg B :
  map uns (map Neg B) = neg B.

Lemma gk3c_dec_ref A B: dec (gk3c A B).

Agreement of classical Gentzen with boolean entailment

Lemma gk3c_iff_sem A s :
  gk3c A [s] bent A s.

Classical Hilbert System Hc


Inductive hilc (A : context): form Prop :=
  | hilcK s t: hilc A (FK s t)
  | hilcS s t u: hilc A (FS s t u)
  | hilcAL s t: hilc A (Imp (And s t) s)
  | hilcAR s t: hilc A (Imp (And s t) t)
  | hilcAI s t: hilc A (Imp s (Imp t (And s t)))
  | hilcOL s t: hilc A (Imp s (Or s t))
  | hilcOR s t: hilc A (Imp t (Or s t))
  | hilcOE s t u: hilc A (Imp (Imp s u) (Imp (Imp t u) (Imp (Or s t) u)))
  | hilcDN s: hilc A (Imp (Not (Not s)) s)
  | hilcA s: s el A hilc A s
  | hilcMP s t: hilc A (Imp s t) hilc A s hilc A t.

Equivalence of Nc and Hc
Lemma hilc_ndc A s :
  hilc A s ndc A s.

Lemma hilcAK A s t:
  hilc A s hilc A (Imp t s).

Lemma hilcAS A s t u :
  hilc A (Imp s (Imp t u)) hilc A (Imp s t) hilc A (Imp s u).

Lemma hilcI A s: hilc A (Imp s s).

Lemma hilcD w A v :
  hilc (w::A) v hilc A (Imp w v).

Lemma ndc_hilc A s :
  ndc A s hilc A s.

Theorem hilc_iff_ndc A s:
  hilc A s ndc A s.