@@ -20,7 +20,7 @@ open import Data.Nat as ℕ using (ℕ; zero; suc; s≤s; z≤n; _∸_)
20
20
)
21
21
import Data.Nat.Properties as ℕₚ
22
22
open import Data.Unit using (tt)
23
- open import Data.Product using (∃; ∄; _×_; _,_; map; proj₁)
23
+ open import Data.Product using (∃; ∃₂; ∄; _×_; _,_; map; proj₁)
24
24
open import Function using (_∘_; id)
25
25
open import Function.Injection using (_↣_)
26
26
open import Relation.Binary as B hiding (Decidable)
@@ -496,6 +496,18 @@ all? P? with decFinSubset U? (λ {f} _ → P? f)
496
496
¬ (∀ i → P i) → (∃ λ i → ¬ P i)
497
497
¬∀⟶∃¬ n P P? ¬P = map id proj₁ (¬∀⟶∃¬-smallest n P P? ¬P)
498
498
499
+ -- The pigeonhole principle.
500
+
501
+ pigeonhole : ∀ {m n} → m ℕ.< n → (f : Fin n → Fin m) →
502
+ ∃₂ λ i j → i ≢ j × f i ≡ f j
503
+ pigeonhole (s≤s z≤n) f = contradiction (f zero) λ ()
504
+ pigeonhole (s≤s (s≤s m≤n)) f with any? (λ k → f zero ≟ f (suc k))
505
+ ... | yes (j , f₀≡fⱼ) = zero , suc j , (λ ()) , f₀≡fⱼ
506
+ ... | no f₀≢fₖ with pigeonhole (s≤s m≤n) (λ j → punchOut (f₀≢fₖ ∘ (j ,_ )))
507
+ ... | (i , j , i≢j , fᵢ≡fⱼ) =
508
+ suc i , suc j , i≢j ∘ suc-injective ,
509
+ punchOut-injective (f₀≢fₖ ∘ (i ,_)) _ fᵢ≡fⱼ
510
+
499
511
------------------------------------------------------------------------
500
512
-- Categorical
501
513
0 commit comments