@@ -1529,30 +1529,48 @@ quotient.induction_on s $ by simp
1529
1529
1530
1530
/- diagonal -/
1531
1531
1532
- theorem revzip_powerset_aux {l : list α} { s t}
1532
+ theorem revzip_powerset_aux {l : list α} ⦃ s t⦄
1533
1533
(h : (s, t) ∈ revzip (powerset_aux l)) : s + t = ↑l :=
1534
1534
begin
1535
1535
rw [revzip, powerset_aux_eq_map_coe, ← map_reverse, zip_map, ← revzip] at h,
1536
1536
simp at h, rcases h with ⟨l₁, l₂, h, rfl, rfl⟩,
1537
1537
exact quot.sound (revzip_sublists _ _ _ h)
1538
1538
end
1539
1539
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 :=
1542
1542
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),
1545
1554
{ rw forall₂_map_right_iff,
1546
1555
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] },
1548
1557
rw [← forall₂_eq_eq_eq, forall₂_map_right_iff], simpa
1549
1558
end
1550
1559
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
+
1551
1569
theorem revzip_powerset_aux_perm {l₁ l₂ : list α} (p : l₁ ~ l₂) :
1552
1570
revzip (powerset_aux l₁) ~ revzip (powerset_aux l₂) :=
1553
1571
begin
1554
1572
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],
1556
1574
exact perm_map _ (powerset_aux_perm p)
1557
1575
end
1558
1576
@@ -1561,27 +1579,42 @@ quot.lift_on s
1561
1579
(λ l, (revzip (powerset_aux l) : multiset (multiset α × multiset α)))
1562
1580
(λ l₁ l₂ h, quot.sound (revzip_powerset_aux_perm h))
1563
1581
1564
- @[simp] theorem diagonal_coe (l : list α) :
1582
+ theorem diagonal_coe (l : list α) :
1565
1583
@diagonal α l = revzip (powerset_aux l) := rfl
1566
1584
1585
+ @[simp] theorem diagonal_coe' (l : list α) :
1586
+ @diagonal α l = revzip (powerset_aux' l) :=
1587
+ quot.sound revzip_powerset_aux_perm_aux'
1588
+
1567
1589
@[simp] theorem mem_diagonal {s₁ s₂ t : multiset α} :
1568
1590
(s₁, s₂) ∈ diagonal t ↔ s₁ + s₂ = t :=
1569
1591
quotient.induction_on t $ λ l, begin
1570
- simp, refine ⟨revzip_powerset_aux, λ h, _⟩,
1592
+ simp [diagonal_coe] , refine ⟨λ h, revzip_powerset_aux h , λ h, _⟩,
1571
1593
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],
1573
1595
exact ⟨_, le_add_right _ _, rfl, add_sub_cancel_left _ _⟩
1574
1596
end
1575
1597
1576
1598
@[simp] theorem diagonal_map_fst (s : multiset α) :
1577
1599
(diagonal s).map prod.fst = powerset s :=
1578
1600
quotient.induction_on s $ λ l,
1579
- by simp [powerset_coe, powerset_aux_eq_map_coe ]
1601
+ by simp [powerset_aux' ]
1580
1602
1581
1603
@[simp] theorem diagonal_map_snd (s : multiset α) :
1582
1604
(diagonal s).map prod.snd = powerset s :=
1583
1605
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
1585
1618
1586
1619
@[simp] theorem card_diagonal (s : multiset α) :
1587
1620
card (diagonal s) = 2 ^ card s :=
0 commit comments