@@ -34,12 +34,14 @@ def of_equiv (α) {β} [fin_enum α] (h : β ≃ α) : fin_enum β :=
34
34
dec_eq := equiv.decidable_eq_of_equiv (h.trans (equiv _)) }
35
35
36
36
/-- create a `fin_enum` instance from an exhaustive list without duplicates -/
37
- def of_nodup_list [decidable_eq α] (xs : list α) (h : ∀ x : α, x ∈ xs) (h' : list.nodup xs) : fin_enum α :=
37
+ def of_nodup_list [decidable_eq α] (xs : list α) (h : ∀ x : α, x ∈ xs) (h' : list.nodup xs) :
38
+ fin_enum α :=
38
39
{ card := xs.length,
39
40
equiv := ⟨λ x, ⟨xs.index_of x,by rw [list.index_of_lt_length]; apply h⟩,
40
41
λ ⟨i,h⟩, xs.nth_le _ h,
41
42
λ x, by simp [of_nodup_list._match_1],
42
- λ ⟨i,h⟩, by simp [of_nodup_list._match_1,*]; rw list.nth_le_index_of; apply list.nodup_erase_dup ⟩ }
43
+ λ ⟨i,h⟩, by simp [of_nodup_list._match_1,*]; rw list.nth_le_index_of;
44
+ apply list.nodup_erase_dup ⟩ }
43
45
44
46
/-- create a `fin_enum` instance from an exhaustive list; duplicates are removed -/
45
47
def of_list [decidable_eq α] (xs : list α) (h : ∀ x : α, x ∈ xs) : fin_enum α :=
@@ -62,7 +64,8 @@ def of_surjective {β} (f : β → α) [decidable_eq α] [fin_enum β] (h : surj
62
64
of_list ((to_list β).map f) (by intro; simp; exact h _)
63
65
64
66
/-- create a `fin_enum` instance using an injection -/
65
- noncomputable def of_injective {α β} (f : α → β) [decidable_eq α] [fin_enum β] (h : injective f) : fin_enum α :=
67
+ noncomputable def of_injective {α β} (f : α → β) [decidable_eq α] [fin_enum β] (h : injective f) :
68
+ fin_enum α :=
66
69
of_list ((to_list β).filter_map (partial_inv f))
67
70
begin
68
71
intro x,
@@ -100,7 +103,8 @@ def finset.enum [decidable_eq α] : list α → list (finset α)
100
103
do r ← finset.enum xs,
101
104
[r,{x} ∪ r]
102
105
103
- @[simp] lemma finset.mem_enum [decidable_eq α] (s : finset α) (xs : list α) : s ∈ finset.enum xs ↔ ∀ x ∈ s, x ∈ xs :=
106
+ @[simp] lemma finset.mem_enum [decidable_eq α] (s : finset α) (xs : list α) :
107
+ s ∈ finset.enum xs ↔ ∀ x ∈ s, x ∈ xs :=
104
108
begin
105
109
induction xs generalizing s; simp [*,finset.enum],
106
110
{ simp [finset.eq_empty_iff_forall_not_mem,(∉)], refl },
@@ -116,7 +120,8 @@ begin
116
120
existsi h,
117
121
by_cases xs_hd ∈ s,
118
122
{ have : {xs_hd} ⊆ s, simp only [has_subset.subset, *, forall_eq, mem_singleton],
119
- simp only [union_sdiff_of_subset this , or_true, finset.union_sdiff_of_subset, eq_self_iff_true], },
123
+ simp only [union_sdiff_of_subset this , or_true, finset.union_sdiff_of_subset,
124
+ eq_self_iff_true], },
120
125
{ left, symmetry, simp only [sdiff_eq_self],
121
126
intro a, simp only [and_imp, mem_inter, mem_singleton, not_mem_empty],
122
127
intros h₀ h₁, subst a, apply h h₀, } }
@@ -126,7 +131,8 @@ instance finset.fin_enum [fin_enum α] : fin_enum (finset α) :=
126
131
of_list (finset.enum (to_list α)) (by intro; simp)
127
132
128
133
instance subtype.fin_enum [fin_enum α] (p : α → Prop ) [decidable_pred p] : fin_enum {x // p x} :=
129
- of_list ((to_list α).filter_map $ λ x, if h : p x then some ⟨_,h⟩ else none) (by rintro ⟨x,h⟩; simp; existsi x; simp *)
134
+ of_list ((to_list α).filter_map $ λ x, if h : p x then some ⟨_,h⟩ else none)
135
+ (by rintro ⟨x,h⟩; simp; existsi x; simp *)
130
136
131
137
instance (β : α → Type *)
132
138
[fin_enum α] [∀ a, fin_enum (β a)] : fin_enum (sigma β) :=
@@ -175,12 +181,14 @@ def pi.tail {α : Type*} {β : α → Type*} {x : α} {xs : list α}
175
181
| a h := f a (list.mem_cons_of_mem _ h)
176
182
177
183
/-- `pi xs f` creates the list of functions `g` such that, for `x ∈ xs`, `g x ∈ f x` -/
178
- def pi {α : Type *} {β : α → Type *} [decidable_eq α] : Π xs : list α, (Π a, list (β a)) → list (Π a, a ∈ xs → β a)
184
+ def pi {α : Type *} {β : α → Type *} [decidable_eq α] : Π xs : list α, (Π a, list (β a)) →
185
+ list (Π a, a ∈ xs → β a)
179
186
| [] fs := [λ x h, h.elim]
180
187
| (x :: xs) fs :=
181
188
fin_enum.pi.cons x xs <$> fs x <*> pi xs fs
182
189
183
- lemma mem_pi {α : Type *} {β : α → Type *} [fin_enum α] [∀a, fin_enum (β a)] (xs : list α) (f : Π a, a ∈ xs → β a) :
190
+ lemma mem_pi {α : Type *} {β : α → Type *} [fin_enum α] [∀a, fin_enum (β a)] (xs : list α)
191
+ (f : Π a, a ∈ xs → β a) :
184
192
f ∈ pi xs (λ x, to_list (β x)) :=
185
193
begin
186
194
induction xs; simp [pi,-list.map_eq_map] with monad_norm functor_norm,
196
204
def pi.enum {α : Type *} (β : α → Type *) [fin_enum α] [∀a, fin_enum (β a)] : list (Π a, β a) :=
197
205
(pi (to_list α) (λ x, to_list (β x))).map (λ f x, f x (mem_to_list _))
198
206
199
- lemma pi.mem_enum {α : Type *} {β : α → Type *} [fin_enum α] [∀a, fin_enum (β a)] (f : Π a, β a) : f ∈ pi.enum β :=
207
+ lemma pi.mem_enum {α : Type *} {β : α → Type *} [fin_enum α] [∀a, fin_enum (β a)] (f : Π a, β a) :
208
+ f ∈ pi.enum β :=
200
209
by simp [pi.enum]; refine ⟨λ a h, f a, mem_pi _ _, rfl⟩
201
210
202
211
instance pi.fin_enum {α : Type *} {β : α → Type *}
0 commit comments