@@ -105,6 +105,130 @@ def GeneralFactorizationRule [inst : DecidableEq X] (A B : Atom sig X) (C : Clau
105
105
Inference sig X :=
106
106
⟨{.pos A :: .pos B :: C}, Clause.substitute σ (.pos A :: C), MostGeneralUnifier [(A, B)] σ⟩
107
107
108
+ lemma validclosed_of_valid [DecidableEq X] {C: Clause sig X} {I : Interpretation sig univ} :
109
+ ValidIn C.toFormula I → ValidIn C.toClosedFormula I := by
110
+ intro heval
111
+ let xs := C.freeVarsList
112
+ let n := xs.length
113
+ have hxsnodup : xs.Nodup := by exact nodup_clauseFreeVarsList sig X _
114
+ have := (@three_three_seven sig X univ _ n C I xs hxsnodup rfl).mpr
115
+ exact fun β => this heval β
116
+
117
+ theorem generalResolutionRuleSound [DecidableEq X] (A B : Atom sig X) (C D : Clause sig X)
118
+ (σ : Substitution sig X) (hmgu : MostGeneralUnifier [(A, B)] σ) :
119
+ @Entails _ _ univ _
120
+ (Formula.and
121
+ (Clause.toClosedFormula sig X (.pos B :: D))
122
+ (Clause.toClosedFormula sig X (.neg A :: C)))
123
+ (((D ++ C).substitute σ).toClosedFormula) := by
124
+ let leftinner : Clause sig X := (.pos B :: D)
125
+ let rightinner : Clause sig X := (.neg A :: C)
126
+ let left := Clause.toClosedFormula sig X (.pos B :: D)
127
+ let right := Clause.toClosedFormula sig X (.neg A :: C)
128
+ intro I β h_entails
129
+ simp [Formula.and] at h_entails
130
+ obtain ⟨hleft, hright⟩ := h_entails
131
+ have hleftentails : EntailsInterpret I β left := by exact hleft
132
+ have hrightentails : EntailsInterpret I β right := by exact hright
133
+ have hleftclosed : Formula.closed left := by
134
+ exact Clause.closedClause_closed sig X (Literal.pos B :: D)
135
+ have hrightclosed : Formula.closed right := by
136
+ exact Clause.closedClause_closed sig X (Literal.neg A :: C)
137
+ have hleftvalid : ValidIn left I := validIn_of_entails_closed I _ hleftclosed (by use β)
138
+ have hrightvalid : ValidIn right I := validIn_of_entails_closed I _ hrightclosed (by use β)
139
+
140
+ -- ∀z (D ∨ B)σ
141
+ let leftxs : List X := leftinner.freeVarsList
142
+ let leftn : ℕ := leftxs.length
143
+ have hleftxsnodup : leftxs.Nodup := by exact nodup_clauseFreeVarsList sig X leftinner
144
+
145
+ let leftys : List X := (leftinner.substitute σ).freeVarsList
146
+ let leftm : ℕ := leftys.length
147
+ have hleftysnodup : leftys.Nodup := by exact nodup_clauseFreeVarsList sig X (Clause.substitute σ leftinner)
148
+
149
+ have hleft338 := @three_three_eight univ sig X _
150
+ leftinner I σ leftn leftm leftxs leftys hleftxsnodup rfl hleftysnodup rfl hleftvalid
151
+
152
+ --∀z (C ∨ ¬A)σ
153
+ let rightxs : List X := rightinner.freeVarsList
154
+ let rightn : ℕ := rightxs.length
155
+ have hrightxsnodup : rightxs.Nodup := by exact nodup_clauseFreeVarsList sig X rightinner
156
+
157
+ let rightys : List X := (rightinner.substitute σ).freeVarsList
158
+ let rightm : ℕ := rightys.length
159
+ have hrightysnodup : rightys.Nodup := by
160
+ exact nodup_clauseFreeVarsList sig X (Clause.substitute σ rightinner)
161
+
162
+ have hright338 := @three_three_eight univ sig X _
163
+ rightinner I σ rightn rightm rightxs rightys hrightxsnodup rfl hrightysnodup rfl hrightvalid
164
+
165
+ -- use 3.3.7
166
+ have hleftinnersub : @ValidIn _ X _ _ (leftinner.substitute σ) I := by
167
+ exact (three_three_seven leftys.length (Clause.toFormula sig X (Clause.substitute σ leftinner)) I
168
+ leftys hleftysnodup rfl).mp
169
+ hleft338
170
+
171
+ have hrightinnersub : @ValidIn _ X _ _ (rightinner.substitute σ) I := by
172
+ exact (three_three_seven rightys.length (Clause.toFormula sig X (Clause.substitute σ rightinner)) I
173
+ rightys hrightysnodup rfl).mp
174
+ hright338
175
+
176
+ have hDσ_of_negBσ : ∀ β : Assignment X univ, ¬Atom.eval I β (B.substitute σ) →
177
+ Formula.eval I β (D.substitute σ) := by
178
+ intro β' hnegatom
179
+ simp [*] at hleftinnersub
180
+ unfold leftinner at hleftinnersub
181
+ have heval_leftinnersub := hleftinnersub β'
182
+ simp [List.map_cons] at heval_leftinnersub
183
+ rcases heval_leftinnersub with hBσ | hDσ
184
+ · simp_all only [Atom.substitute, Atom.pred.injEq, Atom.eval, List.map_map, not_true_eq_false]
185
+ · exact hDσ
186
+
187
+ have hCσ_of_Aσ : ∀ β : Assignment X univ, Atom.eval I β (A.substitute σ) →
188
+ Formula.eval I β (C.substitute σ) := by
189
+ intro β' hatom
190
+ simp [*] at hrightinnersub
191
+ unfold rightinner at hrightinnersub
192
+ have heval_rightinnersub := hrightinnersub β'
193
+ simp [List.map_cons] at heval_rightinnersub
194
+ rcases heval_rightinnersub with hnAσ | hCσ
195
+ · simp only [Atom.eval, Atom.substitute, List.map_map, hnAσ] at hatom
196
+ · exact hCσ
197
+
198
+ have hBσeqAσ: ∀ (β : Assignment X univ), Atom.eval I β (A.substitute σ)
199
+ = Atom.eval I β (B.substitute σ) := by
200
+ intro β
201
+ have hunif : A.substitute σ = B.substitute σ := by
202
+ obtain ⟨hσunif, _⟩ := hmgu
203
+ simp only [Unifier, EqualityProblem.eq_1, List.mem_singleton, Atom.substitute,
204
+ Atom.pred.injEq, forall_eq] at hσunif
205
+ simp only [Atom.substitute, Atom.pred.injEq]
206
+ exact hσunif
207
+ rw [hunif]
208
+
209
+ have hCDσ : ∀ β' : Assignment X univ, EntailsInterpret I β' (Clause.substitute σ (D ++ C)) := by
210
+ intro β'
211
+ by_cases hBσ : Atom.eval I β' (B.substitute σ)
212
+ · have hAσ : Atom.eval I β' (A.substitute σ) := by
213
+ rw [hBσeqAσ]
214
+ exact hBσ
215
+ have hCσ := hCσ_of_Aσ β' hAσ
216
+ unfold Clause.substitute at hCσ
217
+ simp only [EntailsInterpret, Clause.substitute, Clause, List.map_append]
218
+ generalize List.map (Literal.substitute σ) D = D'
219
+ generalize List.map (Literal.substitute σ) C = C' at *
220
+ apply (@eval_append_iff_eval_or sig X univ _ I β' D' C').mpr
221
+ aesop
222
+ · have hDσ := hDσ_of_negBσ β' hBσ
223
+ unfold Clause.substitute at hDσ
224
+ simp only [EntailsInterpret, Clause.substitute, Clause, List.map_append]
225
+ generalize List.map (Literal.substitute σ) D = D' at *
226
+ generalize List.map (Literal.substitute σ) C = C'
227
+ apply (@eval_append_iff_eval_or sig X univ _ I β' D' C').mpr
228
+ aesop
229
+
230
+ exact validclosed_of_valid hCDσ β
231
+
108
232
theorem generalResolution_soundness [inst : DecidableEq X] {A B : Atom sig X} {C D : Clause sig X}
109
233
{σ : Substitution sig X} :
110
234
@Soundness _ _ univ _ ([GeneralResolutionRule A B C D σ, GeneralFactorizationRule A B C σ]):= by
@@ -139,10 +263,3 @@ theorem generalResolution_soundness [inst : DecidableEq X] {A B : Atom sig X} {C
139
263
aesop
140
264
next h_fact_rule =>
141
265
sorry
142
-
143
-
144
- /-
145
- ## Further stuff:
146
- - Compactness
147
-
148
- -/
0 commit comments