@@ -70,7 +70,7 @@ This is then used to define `Fintype.card`, the size of a type.
70
70
71
71
### Finsets from functions
72
72
73
- * `Finset.filter`: Given a predicate `p : α → Bool `, `s.filter p` is
73
+ * `Finset.filter`: Given a decidable predicate `p : α → Prop `, `s.filter p` is
74
74
the finset consisting of those elements in `s` satisfying the predicate `p`.
75
75
76
76
### The lattice structure on subsets of finsets
@@ -2520,8 +2520,7 @@ end DecidablePiExists
2520
2520
2521
2521
section Filter
2522
2522
2523
- -- Porting note: changed from `α → Prop`.
2524
- variable (p q : α → Bool)
2523
+ variable (p q : α → Prop ) [DecidablePred p] [DecidablePred q]
2525
2524
2526
2525
/-- `filter p s` is the set of elements of `s` that satisfy `p`. -/
2527
2526
def filter (s : Finset α) : Finset α :=
@@ -2563,14 +2562,14 @@ theorem filter_filter (s : Finset α) : (s.filter p).filter q = s.filter fun a =
2563
2562
simp only [mem_filter, and_assoc, Bool.decide_and, Bool.decide_coe, Bool.and_eq_true]
2564
2563
#align finset.filter_filter Finset.filter_filter
2565
2564
2566
- theorem filter_true {s : Finset α} : Finset.filter (fun _ => true ) s = s := by
2565
+ theorem filter_True {s : Finset α} : Finset.filter (fun _ => True ) s = s := by
2567
2566
ext; simp
2568
- #align finset.filter_true Finset.filter_true
2567
+ #align finset.filter_true Finset.filter_True
2569
2568
2570
2569
@[simp]
2571
- theorem filter_false (s : Finset α) : filter (fun _ => false ) s = ∅ :=
2570
+ theorem filter_False (s : Finset α) : filter (fun _ => False ) s = ∅ :=
2572
2571
ext fun a => by simp [mem_filter, and_false_iff]
2573
- #align finset.filter_false Finset.filter_false
2572
+ #align finset.filter_false Finset.filter_False
2574
2573
2575
2574
variable {p q}
2576
2575
@@ -2617,9 +2616,8 @@ theorem filter_subset_filter {s t : Finset α} (h : s ⊆ t) : s.filter p ⊆ t.
2617
2616
theorem monotone_filter_left : Monotone (filter p) := fun _ _ => filter_subset_filter p
2618
2617
#align finset.monotone_filter_left Finset.monotone_filter_left
2619
2618
2620
- -- Porting note: was `p q : α → Prop, h : p ≤ q`.
2621
- theorem monotone_filter_right (s : Finset α) ⦃p q : α → Bool⦄
2622
- (h : ∀ a, p a → q a) : s.filter p ≤ s.filter q :=
2619
+ theorem monotone_filter_right (s : Finset α) ⦃p q : α → Prop ⦄ [DecidablePred p] [DecidablePred q]
2620
+ (h : p ≤ q) : s.filter p ≤ s.filter q :=
2623
2621
Multiset.subset_of_le (Multiset.monotone_filter_right s.val h)
2624
2622
#align finset.monotone_filter_right Finset.monotone_filter_right
2625
2623
@@ -2649,25 +2647,28 @@ theorem filter_cons_of_neg (a : α) (s : Finset α) (ha : a ∉ s) (hp : ¬p a)
2649
2647
eq_of_veq <| Multiset.filter_cons_of_neg s.val hp
2650
2648
#align finset.filter_cons_of_neg Finset.filter_cons_of_neg
2651
2649
2652
- theorem disjoint_filter {s : Finset α} {p q : α → Bool} :
2650
+ theorem disjoint_filter {s : Finset α} {p q : α → Prop } [DecidablePred p] [DecidablePred q] :
2653
2651
Disjoint (s.filter p) (s.filter q) ↔ ∀ x ∈ s, p x → ¬q x := by
2654
2652
constructor <;> simp (config := { contextual := true }) [disjoint_left]
2655
2653
#align finset.disjoint_filter Finset.disjoint_filter
2656
2654
2657
- theorem disjoint_filter_filter {s t : Finset α} {p q : α → Bool} :
2655
+ theorem disjoint_filter_filter {s t : Finset α}
2656
+ {p q : α → Prop } [DecidablePred p] [DecidablePred q] :
2658
2657
Disjoint s t → Disjoint (s.filter p) (t.filter q) :=
2659
2658
Disjoint.mono (filter_subset _ _) (filter_subset _ _)
2660
2659
#align finset.disjoint_filter_filter Finset.disjoint_filter_filter
2661
2660
2662
- theorem disjoint_filter_filter' (s t : Finset α) {p q : α → Bool} (h : Disjoint p q) :
2661
+ theorem disjoint_filter_filter' (s t : Finset α)
2662
+ {p q : α → Prop } [DecidablePred p] [DecidablePred q] (h : Disjoint p q) :
2663
2663
Disjoint (s.filter p) (t.filter q) := by
2664
2664
simp_rw [disjoint_left, mem_filter]
2665
2665
rintro a ⟨_, hp⟩ ⟨_, hq⟩
2666
2666
rw [Pi.disjoint_iff] at h
2667
2667
simpa [hp, hq] using h a
2668
2668
#align finset.disjoint_filter_filter' Finset.disjoint_filter_filter'
2669
2669
2670
- theorem disjoint_filter_filter_neg (s t : Finset α) (p : α → Bool) :
2670
+ theorem disjoint_filter_filter_neg (s t : Finset α) (p : α → Prop )
2671
+ [DecidablePred p] [∀ x, Decidable (¬p x)] :
2671
2672
Disjoint (s.filter p) (t.filter fun a => ¬p a) := by
2672
2673
simp_rw [decide_not, Bool.decide_coe, Bool.not_eq_true']
2673
2674
exact disjoint_filter_filter' s t disjoint_compl_right
@@ -2839,16 +2840,12 @@ theorem filter_inter_filter_neg_eq (s t : Finset α) :
2839
2840
2840
2841
theorem filter_union_filter_of_codisjoint (s : Finset α) (h : Codisjoint p q) :
2841
2842
s.filter p ∪ s.filter q = s :=
2842
- (filter_or _ _ _).symm.trans <| filter_true_of_mem fun x _ => by
2843
- simpa [Bool.le_iff_imp] using h.top_le x
2843
+ (filter_or _ _ _).symm.trans <| filter_true_of_mem fun x _ => h.top_le x trivial
2844
2844
#align finset.filter_union_filter_of_codisjoint Finset.filter_union_filter_of_codisjoint
2845
2845
2846
- theorem filter_union_filter_neg_eq (s : Finset α) :
2846
+ theorem filter_union_filter_neg_eq [∀ x, Decidable (¬p x)] (s : Finset α) :
2847
2847
(s.filter p ∪ s.filter fun a => ¬p a) = s :=
2848
- filter_union_filter_of_codisjoint _ _ _ <| by
2849
- convert @codisjoint_hnot_right _ _ p
2850
- ext a
2851
- simp only [decide_not, hnot_eq_compl, Bool.decide_coe, Pi.compl_apply, Bool.compl_eq_bnot]
2848
+ filter_union_filter_of_codisjoint _ _ _ <| @codisjoint_hnot_right _ _ p
2852
2849
#align finset.filter_union_filter_neg_eq Finset.filter_union_filter_neg_eq
2853
2850
2854
2851
end Filter
0 commit comments