Skip to content

Commit b5fc010

Browse files
jamesmckinnaplt-amy
authored andcommitted
fixed merge commit; lifted out lemmas; tweaked
1 parent f2117c7 commit b5fc010

File tree

4 files changed

+55
-43
lines changed

4 files changed

+55
-43
lines changed

CHANGELOG.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2069,8 +2069,6 @@ Other minor changes
20692069
<-step : m < n → m < 1 + n
20702070
m<1+n⇒m<n∨m≡n : m < suc n → m < n ⊎ m ≡ n
20712071
2072-
n<ᵇ1+n : ∀ n → (n <ᵇ suc n) ≡ true
2073-
20742072
z<′s : zero <′ suc n
20752073
s<′s : m <′ n → suc m <′ suc n
20762074
<⇒<′ : m < n → m <′ n
@@ -2121,7 +2119,9 @@ Other minor changes
21212119

21222120
* Added new proofs in `Data.Nat.Combinatorics`:
21232121
```agda
2124-
k![n∸k]!∣n! : k ≤ n → k ! * (n ∸ k) ! ∣ n !
2122+
[n-k]*[n-k-1]!≡[n-k]! : k < n → (n ∸ k) * (n ∸ suc k) ! ≡ (n ∸ k) !
2123+
[n-k]*d[k+1]≡[k+1]*d[k] : k < n → (n ∸ k) * ((suc k) ! * (n ∸ suc k) !) ≡ (suc k) * (k ! * (n ∸ k) !)
2124+
k![n∸k]!∣n! : k ≤ n → k ! * (n ∸ k) ! ∣ n !
21252125
nP1≡n : n P 1 ≡ n
21262126
nC1≡n : n C 1 ≡ n
21272127
nCk+nC[k+1]≡[n+1]C[k+1] : n C k + n C (suc k) ≡ suc n C suc k

src/Data/Nat/Combinatorics.agda

Lines changed: 51 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ open import Data.Nat.Base
1212
open import Data.Nat.DivMod
1313
open import Data.Nat.Divisibility
1414
open import Data.Nat.Properties
15-
open import Relation.Binary.Definitions
15+
open import Relation.Binary.Definitions
1616
open import Relation.Binary.PropositionalEquality
1717
using (_≡_; refl; sym; cong; subst)
1818

@@ -49,11 +49,11 @@ nPn≡n! n = begin-equality
4949
_ = (n ∸ n) !≢0
5050

5151
nP1≡n : n n P 1 ≡ n
52-
nP1≡n zero = k>n⇒nPk≡0 (z<s {n = zero})
52+
nP1≡n zero = refl
5353
nP1≡n n@(suc n-1) = begin-equality
54-
n P 1 ≡⟨ nPk≡n!/[n∸k]! (s≤s (z≤n {n-1})) ⟩
55-
n ! / n-1 ! ≡⟨ m*n/n≡m n (n-1 !) ⟩
56-
n ∎
54+
n P 1 ≡⟨ nPk≡n!/[n∸k]! (s≤s (z≤n {n-1})) ⟩
55+
n ! / n-1 ! ≡⟨ m*n/n≡m n (n-1 !) ⟩
56+
n
5757
where instance
5858
_ = n-1 !≢0
5959

@@ -109,7 +109,51 @@ nC1≡n n@(suc n-1) = begin-equality
109109
------------------------------------------------------------------------
110110
-- Arithmetic of (n C k)
111111

112-
k![n∸k]!∣n! : {n k} k ≤ n k ! * (n ∸ k) ! ∣ n !
112+
module _ {n k} (k<n : k < n) where
113+
114+
private
115+
116+
[n-k] = n ∸ k
117+
[n-k-1] = n ∸ suc k
118+
119+
[n-k]! = [n-k] !
120+
[n-k-1]! = [n-k-1] !
121+
122+
[n-k]≡1+[n-k-1] : [n-k] ≡ suc [n-k-1]
123+
[n-k]≡1+[n-k-1] = +-∸-assoc 1 k<n
124+
125+
126+
[n-k]*[n-k-1]!≡[n-k]! : [n-k] * [n-k-1]! ≡ [n-k]!
127+
[n-k]*[n-k-1]!≡[n-k]! = begin-equality
128+
[n-k] * [n-k-1]!
129+
≡⟨ cong (_* [n-k-1]!) [n-k]≡1+[n-k-1] ⟩
130+
(suc [n-k-1]) * [n-k-1]!
131+
≡˘⟨ cong _! [n-k]≡1+[n-k-1] ⟩
132+
[n-k]! ∎
133+
134+
private
135+
136+
n! = n !
137+
k! = k !
138+
[k+1]! = (suc k) !
139+
140+
d[k] = k! * [n-k]!
141+
[k+1]*d[k] = (suc k) * d[k]
142+
d[k+1] = [k+1]! * [n-k-1]!
143+
[n-k]*d[k+1] = [n-k] * d[k+1]
144+
145+
[n-k]*d[k+1]≡[k+1]*d[k] : [n-k]*d[k+1] ≡ [k+1]*d[k]
146+
[n-k]*d[k+1]≡[k+1]*d[k] = begin-equality
147+
[n-k]*d[k+1]
148+
≡⟨ x∙yz≈y∙xz [n-k] [k+1]! [n-k-1]! ⟩
149+
[k+1]! * ([n-k] * [n-k-1]!)
150+
≡⟨ *-assoc (suc k) k! ([n-k] * [n-k-1]!) ⟩
151+
(suc k) * (k! * ([n-k] * [n-k-1]!))
152+
≡⟨ cong ((suc k) *_) (cong (k! *_) [n-k]*[n-k-1]!≡[n-k]!) ⟩
153+
[k+1]*d[k] ∎
154+
where open CommSemigroupProperties *-commutativeSemigroup
155+
156+
k![n∸k]!∣n! : {n k} k ≤ n k ! * (n ∸ k) ! ∣ n !
113157
k![n∸k]!∣n! {n} {k} k≤n = subst (_∣ n !) (*-comm ((n ∸ k) !) (k !)) ([n∸k]!k!∣n! k≤n)
114158

115159
nCk+nC[k+1]≡[n+1]C[k+1] : n k n C k + n C (suc k) ≡ suc n C suc k
@@ -139,7 +183,7 @@ nCk+nC[k+1]≡[n+1]C[k+1] n k with <-cmp k n
139183
n! / d[k] + _
140184
≡˘⟨ cong (_+ [n-k]*n!/[n-k]*d[k+1]) (m*n/m*o≡n/o (suc k) n! d[k]) ⟩
141185
(suc k * n!) / [k+1]*d[k] + _
142-
≡⟨ cong (((suc k * n!) / [k+1]*d[k]) +_) (/-congʳ [n-k]*d[k+1]≡[k+1]*d[k]) ⟩
186+
≡⟨ cong (((suc k * n!) / [k+1]*d[k]) +_) (/-congʳ ([n-k]*d[k+1]≡[k+1]*d[k] k<n)) ⟩
143187
(suc k * n!) / [k+1]*d[k] + ((n ∸ k) * n! / [k+1]*d[k])
144188
≡˘⟨ +-distrib-/-∣ˡ _ (*-monoʳ-∣ (suc k) (k![n∸k]!∣n! k≤n)) ⟩
145189
((suc k) * n! + (n ∸ k) * n!) / [k+1]*d[k]
@@ -166,48 +210,24 @@ nCk+nC[k+1]≡[n+1]C[k+1] n k with <-cmp k n
166210
[n-k] = n ∸ k
167211
[n-k-1] = n ∸ suc k
168212

169-
[n-k-1]+1≡[n-k] : suc [n-k-1] ≡ [n-k]
170-
[n-k-1]+1≡[n-k] = [m-n-1]+1≡[m-n] k<n
171-
172213
n! = n !
173214
k! = k !
174215
[k+1]! = (suc k) !
175216
[n-k]! = [n-k] !
176217
[n-k-1]! = [n-k-1] !
177218

178-
[n-k]*[n-k-1]!≡[n-k]! : [n-k] * [n-k-1]! ≡ [n-k]!
179-
[n-k]*[n-k-1]!≡[n-k]! = begin-equality
180-
[n-k] * [n-k-1]!
181-
≡˘⟨ cong (_* [n-k-1]!) [n-k-1]+1≡[n-k] ⟩
182-
(suc [n-k-1]) * [n-k-1]!
183-
≡⟨ cong _! [n-k-1]+1≡[n-k] ⟩
184-
[n-k]! ∎
185-
186219
d[k] = k! * [n-k]!
187220
[k+1]*d[k] = (suc k) * d[k]
188221
d[k+1] = [k+1]! * [n-k-1]!
189-
[n-k]*d[k] = [n-k] * d[k]
190222
[n-k]*d[k+1] = [n-k] * d[k+1]
191223
n!/[n-k]*d[k+1] = n ! / [n-k]*d[k+1]
192224
[n-k]*n!/[n-k]*d[k+1] = [n-k] * n! / [n-k]*d[k+1]
193225
[n-k]*n!/[k+1]*d[k] = [n-k] * n! / [k+1]*d[k]
194226

195-
[n-k]*d[k+1]≡[k+1]*d[k] : [n-k]*d[k+1] ≡ [k+1]*d[k]
196-
[n-k]*d[k+1]≡[k+1]*d[k] = begin-equality
197-
[n-k]*d[k+1]
198-
≡⟨ x∙yz≈y∙xz [n-k] [k+1]! [n-k-1]! ⟩
199-
[k+1]! * ([n-k] * [n-k-1]!)
200-
≡⟨ *-assoc (suc k) k! ([n-k] * [n-k-1]!) ⟩
201-
(suc k) * (k! * ([n-k] * [n-k-1]!))
202-
≡⟨ cong ((suc k) *_) (cong (k! *_) [n-k]*[n-k-1]!≡[n-k]!) ⟩
203-
[k+1]*d[k] ∎
204-
where open CommSemigroupProperties *-commutativeSemigroup
205-
206227
instance
207228
[k+1]!*[n-k]!≢0 = (suc k) !* [n-k] !≢0
208229
d[k]≢0 = k !* [n-k] !≢0
209230
d[k+1]≢0 = (suc k) !* (n ∸ suc k) !≢0
210231
[k+1]*d[k]≢0 = m*n≢0 (suc k) d[k]
211232
[n-k]≢0 = ≢-nonZero (m>n⇒m∸n≢0 k<n)
212-
[n-k]*d[k]≢0 = m*n≢0 [n-k] d[k]
213233
[n-k]*d[k+1]≢0 = m*n≢0 [n-k] d[k+1]

src/Data/Nat/Combinatorics/Specification.agda

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,6 @@ k!∣nP′k n@{suc n-1} k@{suc k-1} k≤n@(s≤s k-1≤n-1) with k-1 ≟ n-1
9898
(subst (k ! ∣_) (nP′k≡n!/[n∸k]! k≤n) (k!∣nP′k k≤n))
9999
where instance _ = (n ∸ k) !≢0
100100

101-
102101
------------------------------------------------------------------------
103102
-- Properties of _P_
104103

src/Data/Nat/Properties.agda

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -121,10 +121,6 @@ m ≟ n = map′ (≡ᵇ⇒≡ m n) (≡⇒≡ᵇ m n) (T? (m ≡ᵇ n))
121121
<ᵇ-reflects-< : m n Reflects (m < n) (m <ᵇ n)
122122
<ᵇ-reflects-< m n = fromEquivalence (<ᵇ⇒< m n) <⇒<ᵇ
123123

124-
n<ᵇ1+n : n (n <ᵇ suc n) ≡ true
125-
n<ᵇ1+n zero = refl
126-
n<ᵇ1+n (suc n) = n<ᵇ1+n n
127-
128124
------------------------------------------------------------------------
129125
-- Properties of _≤ᵇ_
130126
------------------------------------------------------------------------
@@ -1577,9 +1573,6 @@ m≤n⇒n∸m≤n (s≤s m≤n) = m≤n⇒m≤1+n (m≤n⇒n∸m≤n m≤n)
15771573
(m + n) ∸ o ≡⟨ +-∸-assoc m o≤n ⟩
15781574
m + (n ∸ o) ∎
15791575

1580-
[m-n-1]+1≡[m-n] : {m n} (n<m : n < m) suc (m ∸ suc n) ≡ m ∸ n
1581-
[m-n-1]+1≡[m-n] n<m = sym (+-∸-assoc 1 n<m)
1582-
15831576
m≤n+m∸n : m n m ≤ n + (m ∸ n)
15841577
m≤n+m∸n zero n = z≤n
15851578
m≤n+m∸n (suc m) zero = ≤-refl
@@ -1940,7 +1933,7 @@ n≡⌈n+n/2⌉ (suc n′@(suc n)) =
19401933
cong suc (trans (n≡⌈n+n/2⌉ _) (cong ⌈_/2⌉ (sym (+-suc n n′))))
19411934

19421935
------------------------------------------------------------------------
1943-
-- Properties of _!
1936+
-- Properties of !_
19441937

19451938
1≤n! : n 1 ≤ n !
19461939
1≤n! zero = ≤-refl

0 commit comments

Comments
 (0)