Skip to content

Commit 099d5dc

Browse files
committed
Add further work on assignment-invariance
1 parent e727df9 commit 099d5dc

File tree

1 file changed

+126
-105
lines changed

1 file changed

+126
-105
lines changed

InferenceInLean/Semantics.lean

Lines changed: 126 additions & 105 deletions
Original file line numberDiff line numberDiff line change
@@ -99,10 +99,10 @@ lemma Set.singleton_of_union_empty {α : Type} {x : α} {A B : Set α}
9999

100100
@[simp]
101101
lemma 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]
113113
lemma 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]
151151
lemma 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
291328
lemma 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

317353
lemma 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

Comments
 (0)