@@ -12,11 +12,12 @@ inductive ProofN (Λ : Axioms α) : Formula α → Type _
1212| axm {A} : A ∈ Λ → ProofN Λ A
1313| implyK {A B} : ProofN Λ $ A 🡒 B 🡒 A
1414| implyS {A B C} : ProofN Λ $ (A 🡒 B 🡒 C) 🡒 (A 🡒 B) 🡒 (A 🡒 C)
15- | efq {A} : ProofN Λ $ ⊥ 🡒 A
16- | dne {A} : ProofN Λ $ ∼∼A 🡒 A
15+ | efq {A} : ProofN Λ $ ⊥ 🡒 A
16+ | dne {A} : ProofN Λ $ ∼∼A 🡒 A
1717| andElimL {A B} : ProofN Λ $ (A ⋏ B) 🡒 A
1818| andElimR {A B} : ProofN Λ $ (A ⋏ B) 🡒 B
1919| andIntro {A B} : ProofN Λ $ A 🡒 B 🡒 (A ⋏ B)
20+ | orElim {A B C} : ProofN Λ $ A ⋎ B 🡒 (A 🡒 C) 🡒 (B 🡒 C) 🡒 C
2021| mdp {A B} : ProofN Λ (A 🡒 B) → ProofN Λ A → ProofN Λ B
2122| nec {A} : ProofN Λ A → ProofN Λ (□A)
2223infix :25 " ⊢ᴺ! " => ProofN
@@ -43,6 +44,7 @@ noncomputable def ofSubsetAxm (hsub : Λ₁ ⊆ Λ₂) : Λ₁ ⊢ᴺ! A → Λ
4344 | andElimL => exact andElimL
4445 | andElimR => exact andElimR
4546 | andIntro => exact andIntro
47+ | orElim => exact orElim
4648 | mdp _ _ ihAB ihA => exact mdp ihAB ihA
4749 | nec _ ihA => exact nec ihA
4850
@@ -69,14 +71,23 @@ variable {Λ : Axioms α} {A B C : Formula α}
6971@[simp, grind .] lemma andElimR : Λ ⊢ᴺ (A ⋏ B) 🡒 B := ⟨ProofN.andElimR⟩
7072@[simp, grind .] lemma andIntro : Λ ⊢ᴺ A 🡒 B 🡒 (A ⋏ B) := ⟨ProofN.andIntro⟩
7173@[simp, grind .] lemma impId : Λ ⊢ᴺ A 🡒 A := ⟨ProofN.impId⟩
74+ @[simp, grind .] lemma orElim : Λ ⊢ᴺ A ⋎ B 🡒 (A 🡒 C) 🡒 (B 🡒 C) 🡒 C := ⟨ProofN.orElim⟩
75+
7276@[grind =>] lemma mdp : Λ ⊢ᴺ A 🡒 B → Λ ⊢ᴺ A → Λ ⊢ᴺ B := λ ⟨h₁⟩ ⟨h₂⟩ => ⟨ProofN.mdp h₁ h₂⟩
77+ @[grind =>] lemma mdp₂ (hABC : Λ ⊢ᴺ A 🡒 B 🡒 C) (hA : Λ ⊢ᴺ A) (hB : Λ ⊢ᴺ B) : Λ ⊢ᴺ C := mdp (mdp hABC hA) hB
78+ @[grind =>] lemma mdp₃ (hABCD : Λ ⊢ᴺ A 🡒 B 🡒 C 🡒 D) (hA : Λ ⊢ᴺ A) (hB : Λ ⊢ᴺ B) (hC : Λ ⊢ᴺ C) : Λ ⊢ᴺ D := mdp (mdp₂ hABCD hA hB) hC
79+
7380@[grind <=] lemma af : Λ ⊢ᴺ A → Λ ⊢ᴺ B 🡒 A := λ ⟨h⟩ => ⟨ProofN.af h⟩
7481@[grind <=] lemma nec : Λ ⊢ᴺ A → Λ ⊢ᴺ □A := λ ⟨h⟩ => ⟨ProofN.nec h⟩
7582@[grind .] lemma lem : Λ ⊢ᴺ A ⋎ ∼A := by simp;
7683
7784lemma andElimLRule (hAB : Λ ⊢ᴺ A ⋏ B) : Λ ⊢ᴺ A := mdp andElimL hAB
7885lemma andElimRRule (hAB : Λ ⊢ᴺ A ⋏ B) : Λ ⊢ᴺ B := mdp andElimR hAB
79- lemma andIntroRule (hA : Λ ⊢ᴺ A) (hB : Λ ⊢ᴺ B) : Λ ⊢ᴺ A ⋏ B := mdp (mdp andIntro hA) hB
86+ lemma andIntroRule (hA : Λ ⊢ᴺ A) (hB : Λ ⊢ᴺ B) : Λ ⊢ᴺ A ⋏ B := mdp₂ andIntro hA hB
87+
88+ -- lemma orIntroLRule (hA : Λ ⊢ᴺ A) : Λ ⊢ᴺ A ⋎ B := mdp orIntroL hA
89+ -- lemma orIntroRRule (hB : Λ ⊢ᴺ B) : Λ ⊢ᴺ A ⋎ B := mdp orIntroR hB
90+ lemma orElimRule (hAB : Λ ⊢ᴺ A ⋎ B) (hAC : Λ ⊢ᴺ A 🡒 C) (hBC : Λ ⊢ᴺ B 🡒 C) : Λ ⊢ᴺ C := mdp₃ orElim hAB hAC hBC
8091
8192@[simp, grind .] lemma verum : Λ ⊢ᴺ ⊤ := by simp;
8293
@@ -92,9 +103,24 @@ lemma consistent_of_unprovable (h : Λ ⊬ᴺ A) : Λ ⊬ᴺ ⊥ := by
92103
93104@[grind =>] lemma dneRule (hA : Λ ⊢ᴺ ∼∼A) : Λ ⊢ᴺ A := mdp dne hA
94105
106+ lemma ctx_mdp {B} (hCAB : Λ ⊢ᴺ C 🡒 A 🡒 B) (hCA : Λ ⊢ᴺ C 🡒 A) : Λ ⊢ᴺ C 🡒 B := mdp₂ implyS hCAB hCA
107+ lemma ctx_mdp₂ (hABCD : Λ ⊢ᴺ A 🡒 B 🡒 C 🡒 D) (hABC : Λ ⊢ᴺ A 🡒 B 🡒 C) : Λ ⊢ᴺ A 🡒 B 🡒 D := ctx_mdp (ctx_mdp (af implyS) hABCD) hABC
108+
95109lemma impTransRule (hAB : Λ ⊢ᴺ A 🡒 B) (hBC : Λ ⊢ᴺ B 🡒 C) : Λ ⊢ᴺ A 🡒 C := by
110+ have : Λ ⊢ᴺ (A 🡒 B 🡒 C) 🡒 (A 🡒 B) 🡒 (A 🡒 C) := implyS;
111+ have : Λ ⊢ᴺ (A 🡒 B) 🡒 (A 🡒 C) := mdp implyS $ mdp₂ implyS (af $ af $ hBC) hAB;
112+ exact mdp this hAB;
113+
114+ lemma imp₃Swap (hABC : Λ ⊢ᴺ A 🡒 B 🡒 C) : Λ ⊢ᴺ B 🡒 A 🡒 C := by
115+ apply ctx_mdp₂;
116+ . apply af hABC;
117+ . apply implyK;
118+
119+ lemma impTrans' : Λ ⊢ᴺ (B 🡒 C) 🡒 (A 🡒 B) 🡒 (A 🡒 C) := impTransRule (imp₃Swap (af impId)) implyS
120+
121+ lemma impTrans : Λ ⊢ᴺ (A 🡒 B) 🡒 (B 🡒 C) 🡒 (A 🡒 C) := by
122+ apply imp₃Swap impTrans';
96123
97- sorry ;
98124
99125lemma lconjElim {X : List _} (hA : A ∈ X) : Λ ⊢ᴺ ⋀X 🡒 A := by
100126 match X with
@@ -128,13 +154,16 @@ lemma lconjIntro {X : List _} (hA : ∀ A ∈ X, Λ ⊢ᴺ A) : Λ ⊢ᴺ ⋀X :
128154 grind;
129155lemma fconjIntro {X : Finset _} (hA : ∀ A ∈ X, Λ ⊢ᴺ A) : Λ ⊢ᴺ ⋀X := lconjIntro (X := X.toList) (by simpa)
130156
131- lemma ctx_mdp {B} (hCAB : Λ ⊢ᴺ C 🡒 A 🡒 B) (hCA : Λ ⊢ᴺ C 🡒 A) : Λ ⊢ᴺ C 🡒 B := mdp (mdp implyS hCAB) hCA
132-
133157lemma ctx_af {B} (hCA : Λ ⊢ᴺ C 🡒 A) : Λ ⊢ᴺ C 🡒 B 🡒 A := impTransRule hCA implyK
134158
159+ lemma ctx_impTransRule (hAB : Λ ⊢ᴺ C 🡒 A 🡒 B) (hBC : Λ ⊢ᴺ C 🡒 B 🡒 D) : Λ ⊢ᴺ C 🡒 A 🡒 D := ctx_mdp (impTransRule hAB $ impTrans) hBC
160+
135161lemma ctxAndIntroRule (hA : Λ ⊢ᴺ C 🡒 A) (hB : Λ ⊢ᴺ C 🡒 B) : Λ ⊢ᴺ C 🡒 (A ⋏ B) := by
136162 exact ctx_mdp (impTransRule hA $ andIntro) hB;
137163
164+ lemma ctxOrElimRule (hAB : Λ ⊢ᴺ C 🡒 A ⋎ B) (hAC : Λ ⊢ᴺ C 🡒 A 🡒 D) (hBC : Λ ⊢ᴺ C 🡒 B 🡒 D) : Λ ⊢ᴺ C 🡒 D :=
165+ ctx_mdp (ctx_mdp (impTransRule hAB orElim) hAC) hBC
166+
138167lemma ctxLconjIntroRule {X : List _} (hA : ∀ A ∈ X, Λ ⊢ᴺ C 🡒 A) : Λ ⊢ᴺ C 🡒 ⋀X := by
139168 match X with
140169 | [] => apply af; simp;
@@ -155,12 +184,12 @@ lemma lconj_subset {X Y : List _} (hsub : X ⊆ Y) : Λ ⊢ᴺ ⋀Y 🡒 ⋀X :=
155184lemma sconj_subset {X Y : Finset _} (hsub : X ⊆ Y) : Λ ⊢ᴺ ⋀Y 🡒 ⋀X := lconj_subset (X := X.toList) (Y := Y.toList) $ by
156185 grind [Finset.mem_toList];
157186
158- lemma uncurry {A B} (h : Λ ⊢ᴺ A 🡒 B 🡒 C) : Λ ⊢ᴺ (A ⋏ B) 🡒 C := by
159- sorry ;
160-
161- lemma curry {A B} (h : Λ ⊢ᴺ (A ⋏ B) 🡒 C) : Λ ⊢ᴺ A 🡒 B 🡒 C := by
187+ lemma uncurry {A B C} (h : Λ ⊢ᴺ A 🡒 B 🡒 C) : Λ ⊢ᴺ (A ⋏ B) 🡒 C := ctx_mdp (impTransRule andElimL h) andElimR
162188
163- sorry ;
189+ lemma curry {A B C} (h : Λ ⊢ᴺ (A ⋏ B) 🡒 C) : Λ ⊢ᴺ A 🡒 B 🡒 C := by
190+ have h₁ : Λ ⊢ᴺ A 🡒 B 🡒 (A ⋏ B) := andIntro;
191+ have h₂ : Λ ⊢ᴺ A 🡒 (A ⋏ B 🡒 C) := af h;
192+ exact ctx_impTransRule h₁ h₂;
164193
165194@[induction_eliminator]
166195protected lemma rec
@@ -175,6 +204,7 @@ protected lemma rec
175204 (andElimL : ∀ {A B}, (motive ((A ⋏ B) 🡒 A) andElimL))
176205 (andElimR : ∀ {A B}, (motive ((A ⋏ B) 🡒 B) andElimR))
177206 (andIntro : ∀ {A B}, (motive (A 🡒 B 🡒 (A ⋏ B)) andIntro))
207+ (orElim : ∀ {A B C}, (motive (A ⋎ B 🡒 (A 🡒 C) 🡒 (B 🡒 C) 🡒 C) orElim))
178208 : ∀ {A}, (d : Λ ⊢ᴺ A) → motive A d := by rintro A ⟨d⟩; induction d <;> grind;
179209
180210end ProvableN
@@ -186,12 +216,10 @@ notation:25 X " ⊢ᴺ[" Λ "] " A => FinitelyDerivableN Λ X A
186216
187217namespace FinitelyDerivableN
188218
189- variable [DecidableEq α]
190219variable {Λ : Axioms α} {X : Finset (Formula α)} {A B C : Formula α}
191220
192221open ProvableN
193222
194- omit [DecidableEq α] in
195223lemma iff_empty_derivable : (Λ ⊢ᴺ A) ↔ (∅ ⊢ᴺ[Λ] A) := by
196224 unfold FinitelyDerivableN;
197225 constructor;
@@ -200,7 +228,7 @@ lemma iff_empty_derivable : (Λ ⊢ᴺ A) ↔ (∅ ⊢ᴺ[Λ] A) := by
200228 . intro h;
201229 exact mdp h (by simp);
202230
203- lemma to_ctx : (X ⊢ᴺ[Λ] A 🡒 B) → ((insert A X) ⊢ᴺ[Λ] B) := by
231+ lemma to_ctx [DecidableEq α] : (X ⊢ᴺ[Λ] A 🡒 B) → ((insert A X) ⊢ᴺ[Λ] B) := by
204232 unfold FinitelyDerivableN;
205233 intro h;
206234 apply impTransRule;
@@ -212,7 +240,7 @@ lemma to_ctx : (X ⊢ᴺ[Λ] A 🡒 B) → ((insert A X) ⊢ᴺ[Λ] B) := by
212240 grind;
213241 . exact uncurry h;
214242
215- lemma from_ctx : ((insert A X) ⊢ᴺ[Λ] B) → (X ⊢ᴺ[Λ] A 🡒 B) := by
243+ lemma from_ctx [DecidableEq α] : ((insert A X) ⊢ᴺ[Λ] B) → (X ⊢ᴺ[Λ] A 🡒 B) := by
216244 unfold FinitelyDerivableN;
217245 intro h;
218246 apply curry;
@@ -228,28 +256,23 @@ lemma from_ctx : ((insert A X) ⊢ᴺ[Λ] B) → (X ⊢ᴺ[Λ] A 🡒 B) := by
228256 . exact fconjElim hC;
229257 . exact h;
230258
231- omit [DecidableEq α] in
232259lemma of_mem_ctx (hA : A ∈ X) : X ⊢ᴺ[Λ] A := by
233260 unfold FinitelyDerivableN;
234261 apply ProvableN.fconjElim hA;
235262
236- omit [DecidableEq α] in
237263lemma mdp (hAB : X ⊢ᴺ[Λ] A 🡒 B) (hA : X ⊢ᴺ[Λ] A) : X ⊢ᴺ[Λ] B := by
238264 unfold FinitelyDerivableN at hAB hA ⊢;
239265 exact ProvableN.ctx_mdp hAB hA;
240266
241- omit [DecidableEq α] in
242267lemma weakening (hsub : X ⊆ Y) (hX : X ⊢ᴺ[Λ] A) : Y ⊢ᴺ[Λ] A := by
243268 unfold FinitelyDerivableN at hX ⊢;
244269 apply ProvableN.impTransRule ?_ hX;
245270 apply ProvableN.sconj_subset hsub;
246271
247- omit [DecidableEq α] in
248272lemma of_provable (hA : Λ ⊢ᴺ A) : X ⊢ᴺ[Λ] A := by
249273 exact weakening (show ∅ ⊆ X by simp) $ iff_empty_derivable.mp hA;
250274
251- lemma orElim (hAB : X ⊢ᴺ[Λ] A ⋎ B) (hA : X ⊢ᴺ[Λ] A 🡒 C) (hB : X ⊢ᴺ[Λ] B 🡒 C) : X ⊢ᴺ[Λ] C := by
252- sorry ;
275+ lemma orElim (hAB : X ⊢ᴺ[Λ] A ⋎ B) (hAC : X ⊢ᴺ[Λ] A 🡒 C) (hBC : X ⊢ᴺ[Λ] B 🡒 C) : X ⊢ᴺ[Λ] C := ctxOrElimRule hAB hAC hBC
253276
254277lemma lem_elim (hA : X ⊢ᴺ[Λ] A 🡒 B) (hNA : X ⊢ᴺ[Λ] ∼A 🡒 B) : X ⊢ᴺ[Λ] B := by
255278 apply orElim (of_provable lem) hA hNA;
0 commit comments