@@ -531,6 +531,54 @@ lemma Atom.eval_of_many_free {univ : Universes} {sig : Signature} {X : Variables
531
531
exact heval
532
532
rw [hargsareequal]
533
533
534
+
535
+ -- this lemma is extracted from the following induction on Formula, and is used for both the
536
+ -- induction step for ∀ and the one for ∃
537
+ lemma Formula.inductionStep_quantifier {univ : Universes} {sig : Signature} {X : Variables}
538
+ [inst : DecidableEq X] (I : Interpretation sig univ) (y : X) (F : Formula sig X) (xs : List X)
539
+ (as : List univ) (β γ : Assignment X univ)
540
+ (ih : ∀ (xs : List X) (as : List univ), xs.length = as.length → F.freeVars ⊆ ↑xs.toFinset →
541
+ ∀ (β γ : X → univ), eval I (Assignment.bigModify β xs as) F ↔
542
+ eval I (Assignment.bigModify γ xs as) F)
543
+ (hlen : xs.length = as.length) (hfree : F.freeVars \ {y} ⊆ ↑xs.toFinset) (a : univ)
544
+ (heval : eval I ((β.bigModify xs as).modify y a) F) :
545
+ eval I ((γ.bigModify xs as).modify y a) F := by
546
+ by_cases hxinxs : y ∈ xs
547
+ · have hsub : F.freeVars ⊆ ↑xs.toFinset := by
548
+ simp_all only [List.coe_toFinset, Set.diff_singleton_subset_iff, Set.mem_setOf_eq,
549
+ Set.insert_eq_of_mem]
550
+ have hsubappend : ↑xs.toFinset ⊆ ↑(xs ++ [y]).toFinset := by
551
+ rw [List.toFinset, List.toFinset]
552
+ intro x hxmem
553
+ simp_all only [List.coe_toFinset, Set.diff_singleton_subset_iff, Set.mem_setOf_eq,
554
+ Set.insert_eq_of_mem, List.toFinset_coe, List.mem_toFinset, List.mem_append,
555
+ List.mem_singleton, true_or]
556
+ have hlenappend : (xs ++ [y]).length = (as ++ [a]).length := by
557
+ simp_all only [List.coe_toFinset, Set.diff_singleton_subset_iff, Set.mem_setOf_eq,
558
+ Set.insert_eq_of_mem, List.length_append, List.length_singleton]
559
+ specialize ih (xs ++ [y]) (as ++ [a]) hlenappend
560
+ (by exact fun ⦃a⦄ a_1 ↦ hsubappend (hsub a_1)) β γ
561
+ simp_all only [List.coe_toFinset, Set.diff_singleton_subset_iff, Set.mem_setOf_eq,
562
+ Set.insert_eq_of_mem, Assignment.bigModify_append, true_iff]
563
+ · by_cases hfin : y ∈ F.freeVars
564
+ · have hfreevars : F.freeVars ⊆ ↑(y :: xs).toFinset := by
565
+ simp_all only [List.coe_toFinset, Set.diff_singleton_subset_iff, List.toFinset_cons,
566
+ Finset.coe_insert]
567
+ specialize ih (y :: xs) (a :: as)
568
+ (Nat.succ_inj'.mpr hlen) hfreevars β γ
569
+ rw [Assignment.bigModify, Assignment.bigModify] at ih
570
+ rw [Assignment.bigModify_modify γ xs as y a hxinxs xs.length rfl hlen]
571
+ rw [← ih]
572
+ rw [← Assignment.bigModify_modify β xs as y a hxinxs xs.length rfl hlen]
573
+ exact heval
574
+ · have hfreevars : F.freeVars \ {y} = F.freeVars := by exact Set.diff_singleton_eq_self hfin
575
+ rw [hfreevars] at hfree
576
+ specialize ih xs as hlen hfree (β.modify y a) (γ.modify y a)
577
+ rw [Assignment.bigModify_modify γ xs as y a hxinxs xs.length rfl hlen]
578
+ apply ih.mp
579
+ rw [← Assignment.bigModify_modify β xs as y a hxinxs xs.length rfl hlen]
580
+ exact heval
581
+
534
582
lemma Formula.eval_of_many_free {univ : Universes} {sig : Signature} {X : Variables}
535
583
[inst : DecidableEq X] (I : Interpretation sig univ) (F : Formula sig X) (xs : List X)
536
584
(as : List univ) (hlen : xs.length = as.length)
@@ -548,182 +596,43 @@ lemma Formula.eval_of_many_free {univ : Universes} {sig : Signature} {X : Variab
548
596
· rw [eval, eval]
549
597
specialize ih xs as hlen hfree β γ
550
598
exact congrArg Not ih
551
- · rw [eval, eval]
552
- rw [Formula.freeVars] at hfree
553
- specialize ihF xs as hlen (fun _ h ↦ hfree (Set.subset_union_left h)) β γ
554
- specialize ihG xs as hlen (fun _ h ↦ hfree (Set.subset_union_right h)) β γ
555
- simp_all only [List.coe_toFinset, Set.union_subset_iff, eq_iff_iff]
556
- · rw [eval, eval]
557
- rw [Formula.freeVars] at hfree
558
- specialize ihF xs as hlen (fun _ h ↦ hfree (Set.subset_union_left h)) β γ
559
- specialize ihG xs as hlen (fun _ h ↦ hfree (Set.subset_union_right h)) β γ
560
- simp_all only [List.coe_toFinset, Set.union_subset_iff, eq_iff_iff]
561
- · rw [eval, eval]
562
- rw [Formula.freeVars] at hfree
563
- specialize ihF xs as hlen (fun _ h ↦ hfree (Set.subset_union_left h)) β γ
564
- specialize ihG xs as hlen (fun _ h ↦ hfree (Set.subset_union_right h)) β γ
565
- simp_all only [List.coe_toFinset, Set.union_subset_iff, eq_iff_iff]
566
- · rw [eval, eval]
599
+ any_goals
600
+ rw [eval, eval]
567
601
rw [Formula.freeVars] at hfree
568
602
specialize ihF xs as hlen (fun _ h ↦ hfree (Set.subset_union_left h)) β γ
569
603
specialize ihG xs as hlen (fun _ h ↦ hfree (Set.subset_union_right h)) β γ
570
604
simp_all only [List.coe_toFinset, Set.union_subset_iff, eq_iff_iff]
571
605
· simp_all only [Assignment, eq_iff_iff, Formula.freeVars, eval]
572
- apply Iff.intro
573
- · intro heval a
574
- specialize heval a
575
- by_cases hxinxs : y ∈ xs
576
- · have hsub : F.freeVars ⊆ ↑xs.toFinset := by
577
- simp_all only [List.coe_toFinset, Set.diff_singleton_subset_iff, Set.mem_setOf_eq,
578
- Set.insert_eq_of_mem]
579
- have hsubappend : ↑xs.toFinset ⊆ ↑(xs ++ [y]).toFinset := by
580
- rw [List.toFinset, List.toFinset]
581
- intro x hxmem
582
- simp_all only [List.coe_toFinset, Set.diff_singleton_subset_iff, Set.mem_setOf_eq,
583
- Set.insert_eq_of_mem, List.toFinset_coe, List.mem_toFinset, List.mem_append,
584
- List.mem_singleton, true_or]
585
- have hlenappend : (xs ++ [y]).length = (as ++ [a]).length := by
586
- simp_all only [List.coe_toFinset, Set.diff_singleton_subset_iff, Set.mem_setOf_eq,
587
- Set.insert_eq_of_mem, List.length_append, List.length_singleton]
588
- specialize ih (xs ++ [y]) (as ++ [a]) hlenappend
589
- (by exact fun ⦃a⦄ a_1 ↦ hsubappend (hsub a_1)) β γ
590
- simp_all only [List.coe_toFinset, Set.diff_singleton_subset_iff, Set.mem_setOf_eq,
591
- Set.insert_eq_of_mem, Assignment.bigModify_append, true_iff]
592
- · by_cases hfin : y ∈ F.freeVars
593
- · have hfreevars : F.freeVars ⊆ ↑(y :: xs).toFinset := by
594
- simp_all only [List.coe_toFinset, Set.diff_singleton_subset_iff, List.toFinset_cons,
595
- Finset.coe_insert]
596
- specialize ih (y :: xs) (a :: as)
597
- (Nat.succ_inj'.mpr hlen) hfreevars β γ
598
- rw [Assignment.bigModify, Assignment.bigModify] at ih
599
- rw [Assignment.bigModify_modify γ xs as y a hxinxs xs.length rfl hlen]
600
- rw [← ih]
601
- rw [← Assignment.bigModify_modify β xs as y a hxinxs xs.length rfl hlen]
602
- exact heval
603
- · have hfreevars : F.freeVars \ {y} = F.freeVars := by exact Set.diff_singleton_eq_self hfin
604
- rw [hfreevars] at hfree
605
- specialize ih xs as hlen hfree (β.modify y a) (γ.modify y a)
606
- rw [Assignment.bigModify_modify γ xs as y a hxinxs xs.length rfl hlen]
607
- apply ih.mp
608
- rw [← Assignment.bigModify_modify β xs as y a hxinxs xs.length rfl hlen]
609
- exact heval
610
- -- TODO: use wlog
611
- · intro heval a
612
- specialize heval a
613
- by_cases hxinxs : y ∈ xs
614
- · have hsub : F.freeVars ⊆ ↑xs.toFinset := by
615
- simp_all only [List.coe_toFinset, Set.diff_singleton_subset_iff, Set.mem_setOf_eq,
616
- Set.insert_eq_of_mem]
617
- have hsubappend : ↑xs.toFinset ⊆ ↑(xs ++ [y]).toFinset := by
618
- rw [List.toFinset, List.toFinset]
619
- intro x hxmem
620
- simp_all only [List.coe_toFinset, Set.diff_singleton_subset_iff, Set.mem_setOf_eq,
621
- Set.insert_eq_of_mem, List.toFinset_coe, List.mem_toFinset, List.mem_append,
622
- List.mem_singleton, true_or]
623
- have hlenappend : (xs ++ [y]).length = (as ++ [a]).length := by
624
- simp_all only [List.coe_toFinset, Set.diff_singleton_subset_iff, Set.mem_setOf_eq,
625
- Set.insert_eq_of_mem, List.length_append, List.length_singleton]
626
- specialize ih (xs ++ [y]) (as ++ [a]) hlenappend
627
- (by exact fun ⦃a⦄ a_1 ↦ hsubappend (hsub a_1)) β γ
628
- simp_all only [List.coe_toFinset, Set.diff_singleton_subset_iff, Set.mem_setOf_eq,
629
- Set.insert_eq_of_mem, Assignment.bigModify_append, true_iff]
630
- · by_cases hfin : y ∈ F.freeVars
631
- · have hfreevars : F.freeVars ⊆ ↑(y :: xs).toFinset := by
632
- simp_all only [List.coe_toFinset, Set.diff_singleton_subset_iff, List.toFinset_cons,
633
- Finset.coe_insert]
634
- specialize ih (y :: xs) (a :: as)
635
- (Nat.succ_inj'.mpr hlen) hfreevars γ β
636
- rw [Assignment.bigModify, Assignment.bigModify] at ih
637
- rw [Assignment.bigModify_modify β xs as y a hxinxs xs.length rfl hlen]
638
- rw [← ih]
639
- rw [← Assignment.bigModify_modify γ xs as y a hxinxs xs.length rfl hlen]
640
- exact heval
641
- · have hfreevars : F.freeVars \ {y} = F.freeVars := by exact Set.diff_singleton_eq_self hfin
642
- rw [hfreevars] at hfree
643
- specialize ih xs as hlen hfree (γ.modify y a) (β.modify y a)
644
- rw [Assignment.bigModify_modify β xs as y a hxinxs xs.length rfl hlen]
645
- apply ih.mp
646
- rw [← Assignment.bigModify_modify γ xs as y a hxinxs xs.length rfl hlen]
647
- exact heval
606
+ wlog himp : ∀ (a : univ), eval I ((β.bigModify xs as).modify y a) F
607
+ · apply Iff.intro
608
+ · intro heval a
609
+ exact False.elim (himp heval)
610
+ · intro heval a
611
+ exact (this I y F xs as γ β ih hlen hfree heval).mp heval a
612
+ · apply Iff.intro
613
+ · clear himp
614
+ intro heval a
615
+ specialize heval a
616
+ exact inductionStep_quantifier I y F xs as β γ ih hlen hfree a heval
617
+ · intro heval a
618
+ simp_all only [List.coe_toFinset, Set.diff_singleton_subset_iff]
648
619
· simp_all only [Assignment, eq_iff_iff, Formula.freeVars, eval]
620
+ wlog himp : ∃ (a : univ), eval I ((β.bigModify xs as).modify y a) F
621
+ · apply Iff.intro
622
+ · intro a
623
+ obtain ⟨a, heval⟩ := a
624
+ simp at himp
625
+ specialize himp a
626
+ exact False.elim (himp heval)
627
+ · intro a
628
+ exact (this I y F xs as γ β ih hlen hfree a).mp a
649
629
apply Iff.intro
650
- · intro a
630
+ · clear himp
631
+ intro a
651
632
obtain ⟨a, heval⟩ := a
652
633
use a
653
- by_cases hxinxs : y ∈ xs
654
- · have hsub : F.freeVars ⊆ ↑xs.toFinset := by
655
- simp_all only [List.coe_toFinset, Set.diff_singleton_subset_iff, Set.mem_setOf_eq,
656
- Set.insert_eq_of_mem]
657
- have hsubappend : ↑xs.toFinset ⊆ ↑(xs ++ [y]).toFinset := by
658
- rw [List.toFinset, List.toFinset]
659
- intro x hxmem
660
- simp_all only [List.coe_toFinset, Set.diff_singleton_subset_iff, Set.mem_setOf_eq,
661
- Set.insert_eq_of_mem, List.toFinset_coe, List.mem_toFinset, List.mem_append,
662
- List.mem_singleton, true_or]
663
- have hlenappend : (xs ++ [y]).length = (as ++ [a]).length := by
664
- simp_all only [List.coe_toFinset, Set.diff_singleton_subset_iff, Set.mem_setOf_eq,
665
- Set.insert_eq_of_mem, List.length_append, List.length_singleton]
666
- specialize ih (xs ++ [y]) (as ++ [a]) hlenappend
667
- (by exact fun ⦃a⦄ a_1 ↦ hsubappend (hsub a_1)) β γ
668
- simp_all only [List.coe_toFinset, Set.diff_singleton_subset_iff, Set.mem_setOf_eq,
669
- Set.insert_eq_of_mem, Assignment.bigModify_append, true_iff]
670
- · by_cases hfin : y ∈ F.freeVars
671
- · have hfreevars : F.freeVars ⊆ ↑(y :: xs).toFinset := by
672
- simp_all only [List.coe_toFinset, Set.diff_singleton_subset_iff, List.toFinset_cons,
673
- Finset.coe_insert]
674
- specialize ih (y :: xs) (a :: as)
675
- (Nat.succ_inj'.mpr hlen) hfreevars β γ
676
- rw [Assignment.bigModify, Assignment.bigModify] at ih
677
- rw [Assignment.bigModify_modify γ xs as y a hxinxs xs.length rfl hlen]
678
- rw [← ih]
679
- rw [← Assignment.bigModify_modify β xs as y a hxinxs xs.length rfl hlen]
680
- exact heval
681
- · have hfreevars : F.freeVars \ {y} = F.freeVars := by exact Set.diff_singleton_eq_self hfin
682
- rw [hfreevars] at hfree
683
- specialize ih xs as hlen hfree (β.modify y a) (γ.modify y a)
684
- rw [Assignment.bigModify_modify γ xs as y a hxinxs xs.length rfl hlen]
685
- apply ih.mp
686
- rw [← Assignment.bigModify_modify β xs as y a hxinxs xs.length rfl hlen]
687
- exact heval
688
- -- TODO: use wlog
689
- · intro a
690
- obtain ⟨a, heval⟩ := a
691
- use a
692
- by_cases hxinxs : y ∈ xs
693
- · have hsub : F.freeVars ⊆ ↑xs.toFinset := by
694
- simp_all only [List.coe_toFinset, Set.diff_singleton_subset_iff, Set.mem_setOf_eq,
695
- Set.insert_eq_of_mem]
696
- have hsubappend : ↑xs.toFinset ⊆ ↑(xs ++ [y]).toFinset := by
697
- rw [List.toFinset, List.toFinset]
698
- intro x hxmem
699
- simp_all only [List.coe_toFinset, Set.diff_singleton_subset_iff, Set.mem_setOf_eq,
700
- Set.insert_eq_of_mem, List.toFinset_coe, List.mem_toFinset, List.mem_append,
701
- List.mem_singleton, true_or]
702
- have hlenappend : (xs ++ [y]).length = (as ++ [a]).length := by
703
- simp_all only [List.coe_toFinset, Set.diff_singleton_subset_iff, Set.mem_setOf_eq,
704
- Set.insert_eq_of_mem, List.length_append, List.length_singleton]
705
- specialize ih (xs ++ [y]) (as ++ [a]) hlenappend
706
- (by exact fun ⦃a⦄ a_1 ↦ hsubappend (hsub a_1)) β γ
707
- simp_all only [List.coe_toFinset, Set.diff_singleton_subset_iff, Set.mem_setOf_eq,
708
- Set.insert_eq_of_mem, Assignment.bigModify_append, true_iff]
709
- · by_cases hfin : y ∈ F.freeVars
710
- · have hfreevars : F.freeVars ⊆ ↑(y :: xs).toFinset := by
711
- simp_all only [List.coe_toFinset, Set.diff_singleton_subset_iff, List.toFinset_cons,
712
- Finset.coe_insert]
713
- specialize ih (y :: xs) (a :: as)
714
- (Nat.succ_inj'.mpr hlen) hfreevars γ β
715
- rw [Assignment.bigModify, Assignment.bigModify] at ih
716
- rw [Assignment.bigModify_modify β xs as y a hxinxs xs.length rfl hlen]
717
- rw [← ih]
718
- rw [← Assignment.bigModify_modify γ xs as y a hxinxs xs.length rfl hlen]
719
- exact heval
720
- · have hfreevars : F.freeVars \ {y} = F.freeVars := by exact Set.diff_singleton_eq_self hfin
721
- rw [hfreevars] at hfree
722
- specialize ih xs as hlen hfree (γ.modify y a) (β.modify y a)
723
- rw [Assignment.bigModify_modify β xs as y a hxinxs xs.length rfl hlen]
724
- apply ih.mp
725
- rw [← Assignment.bigModify_modify γ xs as y a hxinxs xs.length rfl hlen]
726
- exact heval
634
+ exact inductionStep_quantifier I y F xs as β γ ih hlen hfree a heval
635
+ · exact fun a ↦ himp
727
636
728
637
lemma Formula.eval_of_closed {univ : Universes} {sig : Signature} {X : Variables}
729
638
[inst : DecidableEq X] (I : Interpretation sig univ) (F : Formula sig X)
0 commit comments