Skip to content
This repository was archived by the owner on Jul 24, 2024. It is now read-only.

Commit 9699f8d

Browse files
committed
feat(data/multiset): some more theorems about diagonal
1 parent d016186 commit 9699f8d

File tree

2 files changed

+46
-13
lines changed

2 files changed

+46
-13
lines changed

data/multiset.lean

Lines changed: 45 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1529,30 +1529,48 @@ quotient.induction_on s $ by simp
15291529

15301530
/- diagonal -/
15311531

1532-
theorem revzip_powerset_aux {l : list α} {s t}
1532+
theorem revzip_powerset_aux {l : list α} s t
15331533
(h : (s, t) ∈ revzip (powerset_aux l)) : s + t = ↑l :=
15341534
begin
15351535
rw [revzip, powerset_aux_eq_map_coe, ← map_reverse, zip_map, ← revzip] at h,
15361536
simp at h, rcases h with ⟨l₁, l₂, h, rfl, rfl⟩,
15371537
exact quot.sound (revzip_sublists _ _ _ h)
15381538
end
15391539

1540-
theorem revzip_powerset_aux_eq_map [decidable_eq α] (l : list α) :
1541-
revzip (powerset_aux l) = (powerset_aux l).map (λ x, (x, l - x)) :=
1540+
theorem revzip_powerset_aux' {l : list α} ⦃s t⦄
1541+
(h : (s, t) ∈ revzip (powerset_aux' l)) : s + t = ↑l :=
15421542
begin
1543-
have : forall₂ (λ (p : multiset α×multiset α) (s:multiset α), p = (s, ↑l - s))
1544-
(revzip (powerset_aux l)) ((revzip (powerset_aux l)).map prod.fst),
1543+
rw [revzip, powerset_aux', ← map_reverse, zip_map, ← revzip] at h,
1544+
simp at h, rcases h with ⟨l₁, l₂, h, rfl, rfl⟩,
1545+
exact quot.sound (revzip_sublists' _ _ _ h)
1546+
end
1547+
1548+
theorem revzip_powerset_aux_lemma [decidable_eq α] (l : list α)
1549+
{l' : list (multiset α)} (H : ∀ ⦃s t⦄, (s, t) ∈ revzip l' → s + t = ↑l) :
1550+
revzip l' = l'.map (λ x, (x, ↑l - x)) :=
1551+
begin
1552+
have : forall₂ (λ (p : multiset α × multiset α) (s : multiset α), p = (s, ↑l - s))
1553+
(revzip l') ((revzip l').map prod.fst),
15451554
{ rw forall₂_map_right_iff,
15461555
apply forall₂_same, rintro ⟨s, t⟩ h,
1547-
dsimp, rw [← revzip_powerset_aux h, add_sub_cancel_left] },
1556+
dsimp, rw [← H h, add_sub_cancel_left] },
15481557
rw [← forall₂_eq_eq_eq, forall₂_map_right_iff], simpa
15491558
end
15501559

1560+
theorem revzip_powerset_aux_perm_aux' {l : list α} :
1561+
revzip (powerset_aux l) ~ revzip (powerset_aux' l) :=
1562+
begin
1563+
haveI := classical.dec_eq α,
1564+
rw [revzip_powerset_aux_lemma l revzip_powerset_aux,
1565+
revzip_powerset_aux_lemma l revzip_powerset_aux'],
1566+
exact perm_map _ powerset_aux_perm_powerset_aux',
1567+
end
1568+
15511569
theorem revzip_powerset_aux_perm {l₁ l₂ : list α} (p : l₁ ~ l₂) :
15521570
revzip (powerset_aux l₁) ~ revzip (powerset_aux l₂) :=
15531571
begin
15541572
haveI := classical.dec_eq α,
1555-
simp [revzip_powerset_aux_eq_map, coe_eq_coe.2 p],
1573+
simp [λ l:list α, revzip_powerset_aux_lemma l revzip_powerset_aux, coe_eq_coe.2 p],
15561574
exact perm_map _ (powerset_aux_perm p)
15571575
end
15581576

@@ -1561,27 +1579,42 @@ quot.lift_on s
15611579
(λ l, (revzip (powerset_aux l) : multiset (multiset α × multiset α)))
15621580
(λ l₁ l₂ h, quot.sound (revzip_powerset_aux_perm h))
15631581

1564-
@[simp] theorem diagonal_coe (l : list α) :
1582+
theorem diagonal_coe (l : list α) :
15651583
@diagonal α l = revzip (powerset_aux l) := rfl
15661584

1585+
@[simp] theorem diagonal_coe' (l : list α) :
1586+
@diagonal α l = revzip (powerset_aux' l) :=
1587+
quot.sound revzip_powerset_aux_perm_aux'
1588+
15671589
@[simp] theorem mem_diagonal {s₁ s₂ t : multiset α} :
15681590
(s₁, s₂) ∈ diagonal t ↔ s₁ + s₂ = t :=
15691591
quotient.induction_on t $ λ l, begin
1570-
simp, refine ⟨revzip_powerset_aux, λ h, _⟩,
1592+
simp [diagonal_coe], refine ⟨λ h, revzip_powerset_aux h, λ h, _⟩,
15711593
haveI := classical.dec_eq α,
1572-
simp [revzip_powerset_aux_eq_map, h.symm],
1594+
simp [revzip_powerset_aux_lemma l revzip_powerset_aux, h.symm],
15731595
exact ⟨_, le_add_right _ _, rfl, add_sub_cancel_left _ _⟩
15741596
end
15751597

15761598
@[simp] theorem diagonal_map_fst (s : multiset α) :
15771599
(diagonal s).map prod.fst = powerset s :=
15781600
quotient.induction_on s $ λ l,
1579-
by simp [powerset_coe, powerset_aux_eq_map_coe]
1601+
by simp [powerset_aux']
15801602

15811603
@[simp] theorem diagonal_map_snd (s : multiset α) :
15821604
(diagonal s).map prod.snd = powerset s :=
15831605
quotient.induction_on s $ λ l,
1584-
by simp [powerset_coe, powerset_aux_eq_map_coe]
1606+
by simp [powerset_aux']
1607+
1608+
@[simp] theorem diagonal_zero : @diagonal α 0 = (0, 0)::0 := rfl
1609+
1610+
@[simp] theorem diagonal_cons (a : α) (s) : diagonal (a::s) =
1611+
map (prod.map id (cons a)) (diagonal s) +
1612+
map (prod.map (cons a) id) (diagonal s) :=
1613+
quotient.induction_on s $ λ l, begin
1614+
simp [revzip, reverse_append],
1615+
rw [← zip_map, ← zip_map, zip_append, (_ : _++_=_)],
1616+
{congr; simp}, {simp}
1617+
end
15851618

15861619
@[simp] theorem card_diagonal (s : multiset α) :
15871620
card (diagonal s) = 2 ^ card s :=

data/pfun.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ by haveI := classical.dec; exact
132132
/-- `assert p f` is a bind-like operation which appends an additional condition
133133
`p` to the domain and uses `f` to produce the value. -/
134134
def assert (p : Prop) (f : p → roption α) : roption α :=
135-
⟨∃h : p, (f h).dom, λha, (f (let ⟨h, _⟩ := ha in h)).get (let ⟨_, h⟩ := ha in h)
135+
⟨∃h : p, (f h).dom, λha, (f ha.fst).get ha.snd
136136

137137
/-- The bind operation has value `g (f.get)`, and is defined when all the
138138
parts are defined. -/

0 commit comments

Comments
 (0)