@@ -53,26 +53,93 @@ def rotate₃ (d : 𝔇 (φ₄ :: φ₁ :: φ₂ :: φ₃ :: Γ)) : 𝔇 (φ₁
5353
5454alias cut := OneSidedLK.Cut.cut
5555
56+ open Entailment
57+
58+ class EmptyEntailment (𝔇 : outParam (List F → Type *)) {E : Type *} [Entailment E F] (𝓔 : E) where
59+ equiv {φ} : 𝓔 ⊢! φ ≃ 𝔇 [φ]
60+
61+ namespace EmptyEntailment
62+
63+ variable {E : Type *} [Entailment E F] (𝓔 : E) [EmptyEntailment 𝔇 𝓔]
64+
65+ omit [LogicalConnective F] [DeMorgan F] [NegInvolutive F] [OneSidedLK 𝔇] in
66+ lemma provable_iff :
67+ 𝓔 ⊢ φ ↔ Nonempty (𝔇 [φ]) := by
68+ simpa using OneSidedLK.EmptyEntailment.equiv.nonempty_congr
69+
70+ variable [OneSidedLK.Cut 𝔇]
71+
72+ instance : Entailment.ModusPonens 𝓔 where
73+ mdp {φ ψ} b₁ b₂ :=
74+ let b₁ := equiv b₁
75+ let b₂ := equiv b₂
76+ have : 𝔇 [∼(φ ➝ ψ), ∼φ, ψ] := cast (tensor (𝔇 := 𝔇) (identity φ) (identity (∼ψ))) (by simp [DeMorgan.imply])
77+ have : 𝔇 [∼φ, ψ] := wk (cut b₁ this ) (by simp)
78+ have : 𝔇 [ψ] := wk (cut b₂ this ) (by simp)
79+ equiv.symm <| cast this
80+
81+ instance : Entailment.Cl 𝓔 where
82+ negEquiv {φ} := Entailment.cast
83+ (show 𝓔 ⊢! (φ ⋎ ∼φ ⋎ ⊥) ⋏ (φ ⋏ ⊤ ⋎ ∼φ) from
84+ equiv.symm <| and (or <| rotate₁ <| or <| close φ) (or <| and (identity φ) verum'))
85+ (by simp [Axioms.NegEquiv, DeMorgan.imply, LogicalConnective.iff])
86+ verum := equiv.symm <| verum
87+ implyK {φ ψ} :=
88+ have : 𝓔 ⊢! ∼φ ⋎ ∼ψ ⋎ φ := equiv.symm <| or <| rotate₁ <| or <| close φ
89+ Entailment.cast this (by simp [DeMorgan.imply])
90+ implyS {φ ψ χ} :=
91+ have : 𝓔 ⊢! φ ⋏ ψ ⋏ ∼χ ⋎ φ ⋏ ∼ψ ⋎ ∼φ ⋎ χ :=
92+ equiv.symm <| or <| rotate₁ <| or <| rotate₁ <| or <| rotate₃ <| and
93+ (close φ)
94+ (and (rotate₃ <| and (close φ) (close ψ)) (close χ))
95+ Entailment.cast this (by simp [DeMorgan.imply])
96+ and₁ {φ ψ} :=
97+ have : 𝓔 ⊢! (∼φ ⋎ ∼ψ) ⋎ φ := equiv.symm <|or <| or <| close φ
98+ Entailment.cast this (by simp [DeMorgan.imply])
99+ and₂ {φ ψ} :=
100+ have : 𝓔 ⊢! (∼φ ⋎ ∼ψ) ⋎ ψ := equiv.symm <| or <| or <| close ψ
101+ Entailment.cast this (by simp [DeMorgan.imply])
102+ and₃ {φ ψ} :=
103+ have : 𝓔 ⊢! ∼φ ⋎ ∼ψ ⋎ φ ⋏ ψ := equiv.symm <| or <| rotate₁ <| or <| rotate₁ <| and (close φ) (close ψ)
104+ Entailment.cast this (by simp [DeMorgan.imply])
105+ or₁ {φ ψ} :=
106+ have : 𝓔 ⊢! ∼φ ⋎ φ ⋎ ψ := equiv.symm <| or <| rotate₁ <| or <| close φ
107+ Entailment.cast this (by simp [DeMorgan.imply])
108+ or₂ {φ ψ} :=
109+ have : 𝓔 ⊢! ∼ψ ⋎ φ ⋎ ψ := equiv.symm <| or <| rotate₁ <| or <| close ψ
110+ Entailment.cast this (by simp [DeMorgan.imply])
111+ or₃ {φ ψ χ} :=
112+ have : 𝓔 ⊢! φ ⋏ ∼χ ⋎ ψ ⋏ ∼ χ ⋎ ∼φ ⋏ ∼ψ ⋎ χ :=
113+ equiv.symm <| or <| rotate₁ <| or <| rotate₁ <| or <| and
114+ (rotate₃ <| and (close φ) (close χ))
115+ (rotate₂ <| and (close ψ) (close χ))
116+ Entailment.cast this (by simp [DeMorgan.imply])
117+ dne {φ} :=
118+ have : 𝓔 ⊢! ∼φ ⋎ φ := equiv.symm <| or <| close φ
119+ Entailment.cast this (by simp [DeMorgan.imply])
120+
121+ end EmptyEntailment
122+
56123protected class Entailment (𝔇 : outParam (List F → Type *)) (S : Type *) [Entailment S F] [AdjunctiveSet F S] where
57124 equiv {𝓢 : S} {φ} : 𝓢 ⊢! φ ≃ (l : {l : List F // ∀ φ ∈ l, φ ∈ 𝓢}) × 𝔇 (φ :: ∼l)
58125
59- open Entailment
126+ namespace Entailment
60127
61128variable {S : Type *} [Entailment S F] [AdjunctiveSet F S] [OneSidedLK.Entailment 𝔇 S]
62129
63130omit [DeMorgan F] [NegInvolutive F] [OneSidedLK 𝔇] in
64131lemma provable_iff {𝓢 : S} :
65132 𝓢 ⊢ φ ↔ ∃ Γ : List F, (∀ ψ ∈ Γ, ψ ∈ 𝓢) ∧ Nonempty (𝔇 (φ :: ∼Γ)) := by
66- simpa using OneSidedLK.Entailment. equiv.nonempty_congr
133+ simpa using equiv.nonempty_congr
67134
68- def toProof (𝓢 : S) (d : 𝔇 [φ]) : 𝓢 ⊢! φ := OneSidedLK.Entailment. equiv.symm ⟨⟨[], by simp⟩, d⟩
135+ def toProof (𝓢 : S) (d : 𝔇 [φ]) : 𝓢 ⊢! φ := equiv.symm ⟨⟨[], by simp⟩, d⟩
69136
70137def ofAxiom {𝓢 : S} (h : φ ∈ 𝓢) : 𝓢 ⊢! φ :=
71- OneSidedLK.Entailment. equiv.symm ⟨⟨[φ], by simp_all⟩, identity φ⟩
138+ equiv.symm ⟨⟨[φ], by simp_all⟩, identity φ⟩
72139
73140def ofAxiomSubset {𝓢 𝓤 : S} : 𝓢 ⊢! φ → 𝓢 ⊆ 𝓤 → 𝓤 ⊢! φ := fun b h ↦
74- have ⟨l, d⟩ := OneSidedLK.Entailment. equiv b
75- OneSidedLK.Entailment. equiv.symm
141+ have ⟨l, d⟩ := equiv b
142+ equiv.symm
76143 ⟨⟨l, fun φ hφ ↦ AdjunctiveSet.subset_iff.mp h _ (l.prop φ hφ)⟩, d⟩
77144
78145instance : Entailment.Axiomatized S where
@@ -83,31 +150,31 @@ variable [OneSidedLK.Cut 𝔇]
83150
84151instance (𝓢 : S) : Entailment.ModusPonens 𝓢 where
85152 mdp {φ ψ} b₁ b₂ :=
86- let ⟨Γ₁, b₁⟩ := OneSidedLK.Entailment. equiv b₁
87- let ⟨Γ₂, b₂⟩ := OneSidedLK.Entailment. equiv b₂
153+ let ⟨Γ₁, b₁⟩ := equiv b₁
154+ let ⟨Γ₂, b₂⟩ := equiv b₂
88155 have : 𝔇 [∼(φ ➝ ψ), ∼φ, ψ] := cast (tensor (𝔇 := 𝔇) (identity φ) (identity (∼ψ))) (by simp [DeMorgan.imply])
89156 have : 𝔇 (∼φ :: ψ :: ∼↑Γ₁) := wk (cut b₁ this ) (by simp)
90157 have : 𝔇 (ψ :: ∼↑Γ₁ ++ ∼↑Γ₂) := wk (cut b₂ this ) (by simp)
91- OneSidedLK.Entailment. equiv.symm ⟨⟨Γ₁ ++ Γ₂, by simp; grind⟩, cast this ⟩
158+ equiv.symm ⟨⟨Γ₁ ++ Γ₂, by simp; grind⟩, cast this ⟩
92159
93160instance : Entailment.StrongCut S S where
94161 cut {T U φ bs b} :=
95162 let rec bl (l : List F) (hl : ∀ ψ ∈ l, ψ ∈ U) (χ) (d : 𝔇 (χ :: ∼l)) : T ⊢! χ :=
96163 match l with
97- | [] => OneSidedLK.Entailment. equiv.symm ⟨⟨[], by simp⟩, d⟩
164+ | [] => equiv.symm ⟨⟨[], by simp⟩, d⟩
98165 | ψ :: l =>
99166 have bχ : T ⊢! ψ ➝ χ :=
100167 Entailment.cast (bl l (by simp at hl; grind) (∼ψ ⋎ χ) (OneSidedLK.or <| OneSidedLK.rotate₁ d))
101168 (by simp [DeMorgan.imply])
102169 have bψ : T ⊢! ψ := bs (show ψ ∈ U by simp at hl; grind)
103170 Entailment.mdp bχ bψ
104- have ⟨l, hl⟩ := OneSidedLK.Entailment. equiv b
171+ have ⟨l, hl⟩ := equiv b
105172 bl l l.prop φ hl
106173
107174instance : Entailment.DeductiveExplosion S where
108175 dexp b φ :=
109- have ⟨Γ, b⟩ := OneSidedLK.Entailment. equiv b
110- OneSidedLK.Entailment. equiv.symm
176+ have ⟨Γ, b⟩ := equiv b
177+ equiv.symm
111178 ⟨ Γ,
112179 have : 𝔇 [∼⊥] := cast verum (by simp)
113180 wk (cut b this ) (by simp) ⟩
@@ -164,6 +231,24 @@ instance (𝓢 : S) : Entailment.Cl 𝓢 where
164231 have : 𝓢 ⊢! ∼φ ⋎ φ := toProof _ <| or <| close φ
165232 Entailment.cast this (by simp [DeMorgan.imply])
166233
234+ variable {E : Type *} [Entailment E F]
235+
236+ omit [DeMorgan F] [OneSidedLK 𝔇] [Cut 𝔇] in
237+ lemma empty_provable_iff_eprovable (𝓔 : E) [EmptyEntailment 𝔇 𝓔] :
238+ (∅ : S) ⊢ φ ↔ 𝓔 ⊢ φ := by
239+ constructor
240+ · rintro ⟨d⟩
241+ let ⟨l, d⟩ := equiv d
242+ have : 𝓔 ⊢! φ := EmptyEntailment.equiv.symm <| cast d <| by
243+ have : ∀ φ, φ ∉ (l : List F) := by simpa using l.prop
244+ simp [List.eq_nil_iff_forall_not_mem]; grind
245+ exact ⟨this ⟩
246+ · rintro ⟨b⟩
247+ have : 𝔇 [φ] := EmptyEntailment.equiv b
248+ exact ⟨equiv.symm ⟨⟨[], by simp⟩, this ⟩⟩
249+
250+ end Entailment
251+
167252end OneSidedLK
168253
169254end LO
0 commit comments