@@ -99,10 +99,10 @@ lemma Set.singleton_of_union_empty {α : Type} {x : α} {A B : Set α}
9999
100100@[simp]
101101lemma Term.subterms_closed {sig : Signature} {X : Variables} {_I : Interpretation sig univ}
102- [DecidableEq X] (t : Term sig X) (x : X) :
102+ [DecidableEq X] (t : Term sig X) (_x : X) :
103103 ∀ (f : sig.funs) (args : List (Term sig X)), t = Term.func f args →
104104 t.freeVars = {} →
105- ∀ (arg : Term sig X) (harg : arg ∈ args), arg.freeVars = {} := by
105+ ∀ (arg : Term sig X) (_harg : arg ∈ args), arg.freeVars = {} := by
106106 intro f args ht hclosed arg harg
107107 subst ht
108108 induction' args with arg' args' ih generalizing arg
@@ -111,7 +111,7 @@ lemma Term.subterms_closed {sig : Signature} {X : Variables} {_I : Interpretatio
111111
112112@[simp]
113113lemma Term.one_freeVar_of_subterms {univ : Universes} {sig : Signature} {X : Variables}
114- (I : Interpretation sig univ) [DecidableEq X] {t : Term sig X} {x : X} :
114+ (_I : Interpretation sig univ) [DecidableEq X] {t : Term sig X} {x : X} :
115115 ∀ (f : sig.funs) (args : List (Term sig X)), t = Term.func f args →
116116 t.freeVars = {x} →
117117 ∀ (arg : Term sig X) (_harg : arg ∈ args), arg.freeVars = {x} ∨ arg.freeVars = {} := by
@@ -150,7 +150,7 @@ lemma Term.one_freeVar_of_subterms {univ : Universes} {sig : Signature} {X : Var
150150@[simp]
151151lemma Assignment.eval_closed_term {sig : Signature} {X : Variables} {I : Interpretation sig univ}
152152 [DecidableEq X] (t : Term sig X)
153- (x : X) : t.freeVars = {} → ∀ (β γ : Assignment X univ) (a : univ),
153+ (x : X) : t.freeVars = {} → ∀ (β γ : Assignment X univ) (_a : univ),
154154 Term.eval I β t = Term.eval I γ t := by
155155 intro hclosed β γ a
156156 induction' t using Term.induction with y args ih f generalizing β γ a
@@ -222,7 +222,48 @@ def Assignment.bigModify {X : Variables} {univ : Universes} [DecidableEq X]
222222 | x :: xs, a :: as => Assignment.bigModify (β.modify x a) xs as
223223 | _, _ => β
224224
225- def Assignment.bigModify_modify {X : Variables} {univ : Universes} [DecidableEq X]
225+ -- β[] = β
226+ @[simp]
227+ lemma Assignment.bigModify_empty {X : Variables} {univ : Universes} [DecidableEq X]
228+ (β : Assignment X univ) : β.bigModify [] [] = β := rfl
229+
230+ -- β[x ↦ a, x1 ↦ a1, ..., xn ↦ xn] (x) = a
231+ @[simp]
232+ lemma Assignment.bigModify_single_eq {X : Variables} {univ : Universes} [DecidableEq X]
233+ (β : Assignment X univ) (xs : List X) (huniq : xs.Nodup) (as : List univ)
234+ (hlen : xs.length = as.length) (x : X) (a : univ) (hx : x ∉ xs) :
235+ (β.modify x a).bigModify xs as x = a := by
236+ induction' xs with y xs ih generalizing β as x a
237+ · simp_all only [List.nodup_nil, List.length_nil, bigModify, modify, ↓reduceIte]
238+ · match as with
239+ | [] => simp_all only [Assignment, List.nodup_cons, List.length_cons,
240+ List.length_nil, Nat.add_one_ne_zero]
241+ | b :: as =>
242+ rw [Assignment.bigModify]
243+ rw [Assignment.modify_comm x y a b (List.ne_of_not_mem_cons hx)]
244+ exact ih (β.modify y b) (List.Nodup.of_cons huniq) as
245+ (Nat.succ_inj'.mp hlen) x a (by exact List.not_mem_of_not_mem_cons hx)
246+
247+ lemma Assignment.bigModify_append {X : Variables} {univ : Universes} [DecidableEq X]
248+ (β : Assignment X univ) (xs : List X) (as : List univ) (n : ℕ) (hn : n = xs.length)
249+ (hlen : xs.length = as.length) (y : X) (b : univ) (hy : y ∉ xs) :
250+ β.bigModify (xs ++ [y]) (as ++ [b]) = (β.bigModify xs as).modify y b := by
251+ induction' n with n ih generalizing β xs as
252+ · have hxsempty : xs = [] := by exact List.length_eq_zero.mp (id (Eq.symm hn))
253+ have hasempty : as = [] := by subst hxsempty; exact List.length_eq_zero.mp (id (Eq.symm hlen))
254+ subst hxsempty hasempty
255+ simp only [Assignment, List.nil_append, bigModify]
256+ · match xs, as with
257+ | x :: xs, a :: as =>
258+ specialize ih (β.modify x a) xs as
259+ (by simp_all only [List.length_cons, Nat.add_right_cancel_iff])
260+ (Nat.succ_inj'.mp hlen) (List.not_mem_of_not_mem_cons hy)
261+ rw [bigModify, List.cons_append, List.cons_append, bigModify]
262+ rw [ih]
263+ | [], [] => rfl
264+
265+ @[simp]
266+ lemma Assignment.bigModify_modify {X : Variables} {univ : Universes} [DecidableEq X]
226267 (β : Assignment X univ) (xs : List X) (as : List univ) (y : X) (b : univ) (hxuniq : xs.Nodup)
227268 (hxnotinxs : y ∉ xs) (n : ℕ) (hn : n = xs.length) (hlen : xs.length = as.length) :
228269 (β.bigModify xs as).modify y b = (β.modify y b).bigModify xs as := by
@@ -245,27 +286,24 @@ def Assignment.bigModify_modify {X : Variables} {univ : Universes} [DecidableEq
245286 simp_all only [List.nodup_nil, List.not_mem_nil, not_false_eq_true, List.length_nil,
246287 bigModify, implies_true, Nat.add_one_ne_zero]
247288
248- -- β[] = β
249289@[simp]
250- lemma Assignment.bigModify_empty {X : Variables} {univ : Universes} [DecidableEq X]
251- (β : Assignment X univ) : β.bigModify [] [] = β := rfl
252-
253- -- β[x ↦ a, x1 ↦ a1, ..., xn ↦ xn] (x) = a
254- @[simp]
255- lemma Assignment.bigModify_single_eq {X : Variables} {univ : Universes} [DecidableEq X]
256- (β : Assignment X univ) (xs : List X) (huniq : xs.Nodup) (as : List univ)
257- (hlen : xs.length = as.length) (x : X) (a : univ) (hx : x ∉ xs) :
258- (β.modify x a).bigModify xs as x = a := by
259- induction' xs with y xs ih generalizing β as x a
260- · simp_all only [List.nodup_nil, List.length_nil, bigModify, modify, ↓reduceIte]
261- · match as with
262- | [] => simp_all only [Assignment, List.nodup_cons, List.length_cons,
263- List.length_nil, Nat.add_one_ne_zero]
264- | b :: as =>
265- rw [Assignment.bigModify]
266- rw [Assignment.modify_comm x y a b (List.ne_of_not_mem_cons hx)]
267- exact ih (β.modify y b) (List.Nodup.of_cons huniq) as
268- (Nat.succ_inj'.mp hlen) x a (by exact List.not_mem_of_not_mem_cons hx)
290+ lemma Assignment.bigModify_add_nondup {X : Variables} {univ : Universes} [DecidableEq X]
291+ (β : Assignment X univ) (xs : List X) (as : List univ) (x : X) (a : univ) :
292+ ((β.bigModify xs as).modify x a) x = a := by
293+ simp_all only [modify, ↓reduceIte]
294+
295+ #check List.drop
296+ /- lemma Assignment.bigModify_nodup_erase {X : Variables} {univ : Universes} [DecidableEq X]
297+ (β : Assignment X univ) (xs : List X) (_huniq : xs.Nodup) (as : List univ)
298+ (_hlen : xs.length = as.length) (x : X) (a : univ) (_hx : x ∈ xs)
299+ (i : ℕ) (hiinbounds : i < xs.length) (hi : xs[ i ] = x) (ha : as[ i ] = a) :
300+ ∀ (y : X), β.bigModify (xs.eraseIdx i) (as.eraseIdx i) y = if x == y then β x -/
301+ #check List.Nodup.erase
302+ /- lemma Assignment.bigModify_add_nondup {X : Variables} {univ : Universes} [DecidableEq X]
303+ (β : Assignment X univ) (xs : List X) (_huniq : xs.Nodup) (as : List univ)
304+ (_hlen : xs.length = as.length) (x : X) (a : univ) (_hx : x ∈ xs) :
305+ (i : ℕ) (hi : xs[ i ] = x) (a' : univ) (ha : as[ i ] = a')
306+ (bigModify (xs.dropIdx i) (as.dropIdx i)).modify x a = β := by sorry -/
269307
270308-- y ∉ [x1, ..., xn] → β[x1 ↦ a1, ..., xn ↦ an] y = β y
271309@[simp]
@@ -286,12 +324,11 @@ lemma Assignment.bigModify_nonmem {X : Variables} {univ : Universes} [DecidableE
286324 rw [ih]
287325 simp_all only [List.mem_cons, not_or, modify, ↓reduceIte]
288326
289- set_option linter.unusedVariables false
290327-- surjectivity: ∀ a ∈ [a1, ..., an], ∃ x ∈ [x1, ..., xn], β[a₁, ..., an] (x) = a
291328lemma Assignment.bigModify_sur {X : Variables} {univ : Universes} [DecidableEq X]
292329 (β : Assignment X univ) (xs : List X) (huniq : xs.Nodup) (as : List univ)
293330 (a : univ) (ha : a ∈ as) (hlen : xs.length = as.length) :
294- ∃ (x : X) (hx : x ∈ xs), β.bigModify xs as x = a := by
331+ ∃ (x : X) (_hx : x ∈ xs), β.bigModify xs as x = a := by
295332 induction' xs with x xs ih generalizing β as
296333 · match as with
297334 | [] => simp_all only [List.nodup_nil, List.not_mem_nil]
@@ -312,7 +349,6 @@ lemma Assignment.bigModify_sur {X : Variables} {univ : Universes} [DecidableEq X
312349 rcases ih with ⟨x', ⟨hxinbounds, h⟩⟩
313350 use x'
314351 use (List.mem_cons_of_mem x hxinbounds)
315- set_option linter.unusedVariables true
316352
317353lemma List.nodup_index_unique {α} [DecidableEq α] {l : List α} {a : α}
318354 (ha : a ∈ l) (huniq : l.Nodup) :
@@ -462,97 +498,82 @@ lemma Assignment.modFn_eq_id {X : Variables} {univ : Universes} [DecidableEq X]
462498 have hxsnone : xs[i]? = none := by simp_all only [not_lt, getElem?_eq_none]
463499 rw [hasnone, hxsnone, Option.map]
464500
465-
466- lemma Formula.eval_of_many_free {sig : Signature } {X : Variables} [inst : DecidableEq X]
467- (I : Interpretation sig univ) (F : Formula sig X) (xs : List X) (as : List univ )
468- (hxuniq : xs.Nodup) (hlen : xs.length = as.length) (hfree : F.freeVars = xs.toFinset) :
469- (∀ (β γ : Assignment X univ),
501+ --lemma Assignment.modify_same
502+ lemma Formula.eval_of_many_free {univ : Universes } {sig : Signature} {X : Variables}
503+ [inst : DecidableEq X] (I : Interpretation sig univ) (F : Formula sig X) (xs : List X)
504+ (as : List univ) ( hxuniq : xs.Nodup) (hlen : xs.length = as.length)
505+ (hfree : F.freeVars ⊆ xs.toFinset) : ( ∀ (β γ : Assignment X univ),
470506 Formula.eval I (β.bigModify xs as) F = Formula.eval I (γ.bigModify xs as) F) := by
471507 intro β γ
472- induction' F with _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ x F ih y f ih generalizing β γ xs as
508+ induction' F with a F ih F G ihF ihG F G ihF ihG F G ihF ihG F G ihF ihG y F ih y F ih generalizing β γ xs as
473509 · simp_all only [Formula.freeVars, eval]
474510 · simp_all only [Formula.freeVars, eval]
475511 · sorry
476- · sorry
477- · sorry
478- · sorry
479- · sorry
480- · sorry
512+ · rw [eval, eval]
513+ specialize ih xs as hxuniq hlen hfree β γ
514+ exact congrArg Not ih
515+ · rw [eval, eval]
516+ rw [Formula.freeVars] at hfree
517+ specialize ihF xs as hxuniq hlen (fun _ h ↦ hfree (Set.subset_union_left h)) β γ
518+ specialize ihG xs as hxuniq hlen (fun _ h ↦ hfree (Set.subset_union_right h)) β γ
519+ simp_all only [List.coe_toFinset, Set.union_subset_iff, eq_iff_iff]
520+ · rw [eval, eval]
521+ rw [Formula.freeVars] at hfree
522+ specialize ihF xs as hxuniq hlen (fun _ h ↦ hfree (Set.subset_union_left h)) β γ
523+ specialize ihG xs as hxuniq hlen (fun _ h ↦ hfree (Set.subset_union_right h)) β γ
524+ simp_all only [List.coe_toFinset, Set.union_subset_iff, eq_iff_iff]
525+ · rw [eval, eval]
526+ rw [Formula.freeVars] at hfree
527+ specialize ihF xs as hxuniq hlen (fun _ h ↦ hfree (Set.subset_union_left h)) β γ
528+ specialize ihG xs as hxuniq hlen (fun _ h ↦ hfree (Set.subset_union_right h)) β γ
529+ simp_all only [List.coe_toFinset, Set.union_subset_iff, eq_iff_iff]
530+ · rw [eval, eval]
531+ rw [Formula.freeVars] at hfree
532+ specialize ihF xs as hxuniq hlen (fun _ h ↦ hfree (Set.subset_union_left h)) β γ
533+ specialize ihG xs as hxuniq hlen (fun _ h ↦ hfree (Set.subset_union_right h)) β γ
534+ simp_all only [List.coe_toFinset, Set.union_subset_iff, eq_iff_iff]
481535 · simp_all only [Assignment, eq_iff_iff, Formula.freeVars, eval]
482536 apply Iff.intro
483537 · intro heval a
484538 specialize heval a
485- by_cases hxinxs : x ∈ xs
486- · by_contra hcontra
487- clear heval hcontra ih
488- have hxinxs₂ : x ∈ {a | a ∈ xs} := by simp_all only [List.coe_toFinset, Set.mem_setOf_eq ]
489- clear hxinxs
490- rw [ List.coe_toFinset] at hfree
491- generalize {a | a ∈ xs} = A, F.freeVars = B at *
492- subst hfree
493- simp_all only [Set.mem_diff, Set.mem_singleton_iff, not_true_eq_false, and_false]
494- · by_cases hfin : F.freeVars = ↑xs.toFinset ∪ {x}
495- · have hfreexxs : F.freeVars = ↑(x :: xs).toFinset := by
496- simp_all only [List.coe_toFinset, Set.union_singleton, Set.mem_singleton_iff,
497- Set.insert_diff_of_mem , Set.mem_setOf_eq, not_false_eq_true ,
498- Set.diff_singleton_eq_self, List.toFinset_cons, Finset.coe_insert]
499- specialize ih (x :: xs) (a :: as) (List.Nodup.cons hxinxs hxuniq)
500- (Nat.succ_inj'.mpr hlen) hfreexxs β γ
539+ by_cases hxinxs : y ∈ xs
540+ · have hsub : F.freeVars ⊆ ↑xs.toFinset := by
541+ simp_all only [List.coe_toFinset, Set.diff_singleton_subset_iff, Set.mem_setOf_eq,
542+ Set.insert_eq_of_mem ]
543+ -- remove y from xs, then modify with y
544+ rcases List.nodup_index_unique hxinxs hxuniq with ⟨i, hiinbounds, hiindex, hiindexOf, _⟩
545+ specialize ih (xs.eraseIdx i ++ [y]) (as.eraseIdx i ++ [a]) sorry sorry sorry β γ
546+ --rw [ Assignment.bigModify_append ] at ih
547+ --rw [ Assignment.bigModify ] at ih
548+ sorry
549+ · by_cases hfin : y ∈ F.freeVars
550+ · have hfreevars : F.freeVars ⊆ ↑(y :: xs).toFinset := by
551+ simp_all only [List.coe_toFinset , Set.diff_singleton_subset_iff, List.toFinset_cons ,
552+ Finset.coe_insert]
553+ specialize ih (y :: xs) (a :: as) (List.Nodup.cons hxinxs hxuniq)
554+ (Nat.succ_inj'.mpr hlen) hfreevars β γ
501555 rw [Assignment.bigModify, Assignment.bigModify] at ih
502- rw [Assignment.bigModify_modify γ xs as x a hxuniq hxinxs xs.length rfl hlen]
503- apply ih.mp
504- rw [← Assignment.bigModify_modify β xs as x a hxuniq hxinxs xs.length rfl hlen]
556+ rw [Assignment.bigModify_modify γ xs as y a hxuniq hxinxs xs.length rfl hlen]
557+ rw [← ih]
558+ rw [← Assignment.bigModify_modify β xs as y a hxuniq hxinxs xs.length rfl hlen]
505559 exact heval
506- · have hfreexs : F.freeVars = ↑xs.toFinset := by
507- clear ih heval hlen hxuniq
508- rw [List.coe_toFinset] at *
509- have hxnotinxs : x ∉ {a | a ∈ xs} := by
510- simp_all only [Set.union_singleton, Set.mem_setOf_eq, not_false_eq_true]
511- clear hxinxs
512- generalize {a | a ∈ xs} = A, F.freeVars = B at *
513- aesop
514- specialize ih xs as hxuniq hlen hfreexs (β.modify x a) (γ.modify x a)
515- rw [Assignment.bigModify_modify γ xs as x a hxuniq hxinxs xs.length rfl hlen]
560+ · have hfreevars : F.freeVars \ {y} = F.freeVars := by exact Set.diff_singleton_eq_self hfin
561+ rw [hfreevars] at hfree
562+ specialize ih xs as hxuniq hlen hfree (β.modify y a) (γ.modify y a)
563+ rw [Assignment.bigModify_modify γ xs as y a hxuniq hxinxs xs.length rfl hlen]
516564 apply ih.mp
517- rw [← Assignment.bigModify_modify β xs as x a hxuniq hxinxs xs.length rfl hlen]
565+ rw [← Assignment.bigModify_modify β xs as y a hxuniq hxinxs xs.length rfl hlen]
518566 exact heval
519567 · sorry -- completely analogous
520- · sorry
568+ · sorry -- completely analogous to forall
521569
522- lemma Formula.eval_of_closed {sig : Signature} {X : Variables} [inst : DecidableEq X]
523- (I : Interpretation sig univ) (F : Formula sig X) (hclosed : Formula.closed F) :
570+ lemma Formula.eval_of_closed {univ : Universes} {sig : Signature} {X : Variables}
571+ [inst : DecidableEq X] (I : Interpretation sig univ) (F : Formula sig X)
572+ (hclosed : Formula.closed F) :
524573 (∀ (β γ : Assignment X univ), Formula.eval I β F = Formula.eval I γ F) := by
525574 intro β γ
526- induction' F with _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ x F ih x f ih generalizing β γ
527- · simp_all only [Formula.closed, Formula.freeVars, eval]
528- · simp_all only [Formula.closed, Formula.freeVars, eval]
529- · sorry
530- · sorry
531- · sorry
532- · sorry
533- · sorry
534- · sorry
535- ·
536- simp_all only [Formula.closed, eq_iff_iff, Formula.freeVars, eval]
537- by_cases h : F.freeVars = ∅
538- · simp_all only [Assignment, forall_const, Set.mem_empty_iff_false, not_false_eq_true, Set.diff_singleton_eq_self]
539- apply Iff.intro
540- · intro hmod a
541- specialize ih (β.modify x a) (γ.modify x a)
542- simp_all only [true_iff]
543- · intro hmod a
544- specialize ih (β.modify x a) (γ.modify x a)
545- simp_all only [iff_true]
546- apply Iff.intro
547- · intro hmod a
548- simp_all only [Assignment, IsEmpty.forall_iff]
549- have honefree : F.freeVars = {x} := by
550- generalize F.freeVars = A at *
551- ext y
552- sorry
553- clear hclosed h
554- sorry
555- · intro hmod a
556- simp_all only [Assignment, IsEmpty.forall_iff]
557- sorry
558- · sorry
575+ have s := Formula.eval_of_many_free I F [] [] List.nodup_nil rfl (by aesop) β γ
576+ rw [Assignment.bigModify, Assignment.bigModify] at s
577+ exact s
578+ · aesop
579+ · aesop
0 commit comments