namespace latin:/❚
fixmeta ur:?LF❚
theory Tableaux =
  include ?Propositions ❙
  marktrue : prop ⟶ type ❘ # 1 ¹ prec -5 ❘ role TabMarker ❙
  markfalse : prop ⟶ type ❘ # 1 ⁰ prec -5 ❘ role TabMarker ❙
  closedbranch : type ❘ # ⊥ ❘ = {p} p¹ ❘  role TabClosed ❙
  // We could define many of the rules below by defining P⁰ = P¹ ⟶ ⊥ ❙
  closebranch : {P} P¹ ⟶ P⁰ ⟶ ⊥ ❘ # close10 2 3 ❙
  closebranch2 : {P} P⁰ ⟶ P¹ ⟶ ⊥ ❘ # close01 2 3 ❘ = [P,p0,p1] close10 p1 p0 ❙
  proofstart : {P} (P⁰ ⟶ ⊥) ⟶ P¹ ❘ # start1 2 ❙
  refutationstart : {P} (P¹ ⟶ ⊥) ⟶ P⁰ ❘ # start0 2 ❙
  classicality : {P} ((P¹ ⟶ ⊥) ⟶ ⊥) ⟶ P¹ ❙
❚
// We need classicality to prove proofstart ❚
view Tableaux2Proofs : ?Tableaux -> ?Classical =
  prop = prop ❙
  marktrue = [p] ⊦ p ❙
  markfalse = [p] ⊦ p ⟶ ↯ ❙
  closedbranch = ↯ ❙
  closebranch = [P, p1, p0] p0 p1 ❙
  proofstart = classical ❙
  classicality = classical ❙
  refutationstart = [P,pr] pr ❙
❚
view Proofs2Tableaux : ?Proofs -> ?Tableaux =
  prop = prop ❙
  ded = [p] p¹ ❙
  // classical = classicality ❙
❚
theory NegationTab =
  include ?Negation ❙
  include ?Tableaux ❙
  negationTab0 : {P} ¬P⁰ ⟶ (P¹ ⟶ ⊥) ⟶ ⊥ ❘ # negt0 2 3 ❙
  negationTab1 : {P} ¬P¹ ⟶ (P⁰ ⟶ ⊥) ⟶ ⊥ ❘ # negt1 2 3 ❙
❚
view NegationTab2ND : ?NegationTab -> ?PLND =
  include ?Tableaux2Proofs ❙
  not = not ❙
  negationTab0 = [P, np0, p1r] np0 (notI p1r) ❙
  negationTab1 = [P, np1, p0r] np1 notE (classical p0r) ❙
❚
view NegationND2Tab : ?NegationND -> ?NegationTab =
  include ?Proofs2Tableaux ❙
  not = not ❙
  notI = [F, fr : F¹ ⟶ ⊥] start1 ([nfr : ¬F⁰] negt0 nfr fr) ❙
  notE = [F, nf, f] negt1 nf ([f0] close10 f f0) ❙
❚
theory ConjunctionTab =
  include ?Conjunction ❙
  include ?Tableaux ❙
  conjunctionTab0 : {A,B} A∧B⁰ ⟶ (A⁰ ⟶ ⊥) ⟶ (B⁰ ⟶ ⊥) ⟶ ⊥ ❘ # conjt0 3 4 5 ❙
  conjunctionTab1 : {A,B} A∧B¹ ⟶ (A¹ ⟶ B¹ ⟶ ⊥) ⟶ ⊥ ❘ # conjt1 3 4 ❙
❚
// view ConjunctionTab2ND : ?ConjunctionTab -> ?PLND =
  and = and ❙
❚
theory DisjunctionTab =
  include ?Disjunction ❙
  include ?Tableaux ❙
  disjunctionTab0 : {A,B} A∨B⁰ ⟶ (A⁰ ⟶ B⁰ ⟶ ⊥) ⟶ ⊥ ❘ # disjt0 3 4 ❙
  disjunctionTab1 : {A,B} A∨B¹ ⟶ (A¹ ⟶ ⊥) ⟶ (B¹ ⟶ ⊥) ⟶ ⊥ ❘ # disjt1 3 4 5 ❙
❚
theory ImplicationTab =
  include ?Implication ❙
  include ?Tableaux ❙
  implicationTab0 : {A,B} A⇒B⁰ ⟶ (A¹ ⟶ B⁰ ⟶ ⊥) ⟶ ⊥ ❘ # implt0 3 4 ❙
  implicationTab1 : {A,B} A⇒B¹ ⟶ (A⁰ ⟶ ⊥) ⟶ (B¹ ⟶ ⊥) ⟶ ⊥ ❘ # implt1 3 4 5 ❙
❚
theory EquivalenceTab =
  include ?Equivalence ❙
  include ?Tableaux ❙
  equivalenceTab0 : {A,B} A⇔B⁰ ⟶ (A⁰ ⟶ B¹ ⟶ ⊥) ⟶ (A¹ ⟶ B⁰ ⟶ ⊥) ⟶ ⊥ ❘ # equivt0 3 4 5 ❙
  equivalenceTab1 : {A,B} A⇔B¹ ⟶ (A⁰ ⟶ B⁰ ⟶ ⊥) ⟶ (A¹ ⟶ B¹ ⟶ ⊥) ⟶ ⊥ ❘ # equivt1 3 4 5 ❙
❚
theory UniversalQuantificationTab =
  include ?UniversalQuantification ❙
  include ?Tableaux ❙
  forallT : {P, X} ∀ P ¹ ⟶ (P X ¹ ⟶ ⊥) ⟶ ⊥ ❘ role ApplyRepeatedly ❙
  forallF : {P} ∀ P ⁰ ⟶ ({x} P x ⁰ ⟶ ⊥) ⟶ ⊥ ❙
❚
theory ExistentialQuantificationTab =
  include ?ExistentialQuantification ❙
  include ?Tableaux ❙
  existsT : {P} ∃ P ¹ ⟶ ({x} P x ¹ ⟶ ⊥) ⟶ ⊥ ❙
  existsF : {P, X} ∃ P ⁰ ⟶ (P X ⁰ ⟶ ⊥) ⟶ ⊥ ❘ role ApplyRepeatedly ❙
❚