module InfinitePigeon where ---------------------------------------------------------------------- -- -- Running a classical proof with choice in Agda. -- ---------------------------------------------------------------------- -- Martin Escardo & Paulo Oliva. -- Version of 12th May 2011, slightly simplified 19th May 2011. -- ---------------------------------------------------------------------- -- Theorem (Pigeonhole Principle). -- -- Every infinite boolean sequence has a constant infinite -- subsequence. ---------------------------------------------------------------------- -- -- We give a proof that uses excluded middle and countable choice. -- -- In the module FinitePigeon.agda we derive a corollary that we run -- in the module Examples.agda, namely that every infinite sequence -- has constant subsequences of arbitrary length. The point is to -- illustrate in Agda how we can get witnesses from classical proofs -- that use countable choice. The finite pigeonhole principle has a -- simple constructive proof, of course, and hence this is really for -- illustration purposes only. -- We work with Friedman's A-translation, which prefixes the -- generalized double-negation modality K in front of existential -- quantifiers, disjunctions and equations, where KA = ((A→R)→R) is -- defined in the module JK-Monads.agda. The proposition R is -- arbitrary in the proofs of this module, but carefully chosen in the -- main theorem of the module FinitePigeon.agda, by an application of -- Friedman's trick. We don't work strictly with the A-translation: -- when we can get away with it, we place fewer K's than the -- formal definition of the translation demands. -- -- Because ⊥ (false) is the empty disjunction, it gets translated to -- K ⊥, which is equivalent to R. So think of R as ⊥ in the proofs -- below. Of course, it is not true that R→A for any A (ex falso -- quodlibet, or ⊥-elimination). But this does hold for any A in the -- image of the translation. -- -- Classical countable choice (i.e. choice formulated with the -- classical existential quantifier) is given a proof term via the -- K-shift (more commonly known as the double negation shift) in the -- module K-AC-N.agda and K-Shift.agda. We use either of (1) the -- Berardi-Bezem-Coquand functional (1998), (2) Berger-Oliva's -- modified bar recursion (2005), (3) Escardo-Oliva's countable -- product of selection functions (2010). -- -- References. -- -- S. Berardi, M. Bezem, and T. Coquand. On the Computational -- Content of the Axiom of Choice. J. Symbolic Logic, Volume 63, -- Issue 2 (1998), 600-622. -- -- U. Berger and P. Oliva. Modified bar recursion. Mathematical -- Structures in Computer Science, 16(2):163-183, 2006 -- -- U. Berger and P.Oliva. Modified bar recursion and classical -- dependent choice. Lecture Notes in Logic, 20:89-107, 2005 -- -- M. Escardo and P. Oliva. Selection functions, bar recursion, -- and backward induction. Mathematical Structures in Computer -- Science, Volume 20, Issue 2, 2010, Cambridge University Press. -- -- M. Escardo and P. Oliva. The Peirce translation and the double -- negation shift. CiE 2010, Springer LNCS. -- -- M. Escardo and P. Oliva. What Sequential Games, the Tychonoff -- Theorem and the Double-Negation Shift have in Common. ACM -- SIGPLAN MSFP 2010. -- ----------------------------------------------------------------------- -- Navigate the automatically generated html version of this set of -- files by clicking at any word or symbol, to be taken to where it is -- defined. ----------------------------------------------------------------------- open import Logic open import LogicalFacts open import Two open import Naturals open import Addition open import Order open import Cantor open import JK-Monads open import Equality open import K-AC-N open import JK-LogicalFacts Pigeonhole : {R : Ω} → ₂ℕ → Ω Pigeonhole {R} α = ∃ \(b : ₂) → ∃ \(g : ℕ → ℕ) → ∀(i : ℕ) → g i < g(i + 1) ∧ K {R} (α(g i) ≡ b) pigeonhole : {R : Ω} → ---------- ∀(α : ₂ℕ) → K(Pigeonhole α) pigeonhole {R} α = K-∨-elim case₀ case₁ K-Excluded-Middle where A : Ω A = ∃ \(n : ℕ) → ∀(i : ℕ) → K(α(n + i) ≡ ₀) case₀ : A → K(Pigeonhole α) case₀ = ηK ∘ lemma₁ where lemma₁ : A → Pigeonhole α lemma₁ (∃-intro n h) = ∃-intro ₀ (∃-intro (λ i → n + i) λ i → (∧-intro (less-proof 0) (h i))) case₁ : (A → R) → K(Pigeonhole α) case₁ assumption = K-functor lemma₇ lemma₆ where lemma₂ : ∀(n : ℕ) → (∀(i : ℕ) → K(α(n + i) ≡ ₀)) → R lemma₂ = not-exists-implies-forall-not assumption lemma₃ : ∀(n : ℕ) → K∃ \(i : ℕ) → K(α(n + i) ≡ ₁) lemma₃ = lemma₄ lemma₂ where lemma₄ : (∀(n : ℕ) → (∀(i : ℕ) → K(α(n + i) ≡ ₀)) → R) → (∀(n : ℕ) → K∃ \(i : ℕ) → K(α(n + i) ≡ ₁)) lemma₄ h n = K-functor lemma₅ (not-forall-not-implies-K-exists(h n)) where lemma₅ : (∃ \(i : ℕ) → α(n + i) ≡ ₀ → R) → ∃ \(i : ℕ) → K(α(n + i) ≡ ₁) lemma₅ (∃-intro i r) = (∃-intro i (two-equality-cases (α(n + i)) r)) lemma₆ : K∃ \(f : ℕ → ℕ) → ∀(n : ℕ) → K(α(n + f n) ≡ ₁) lemma₆ = K-AC-ℕ efqs lemma₃ where efqs : ∀(n : ℕ) → R → ∃ \(i : ℕ) → K(α(n + i) ≡ ₁) efqs n r = ∃-intro 0 (λ p → r) lemma₇ : (∃ \(f : ℕ → ℕ) → ∀(n : ℕ) → K(α(n + f n) ≡ ₁)) → Pigeonhole α lemma₇ (∃-intro f h) = ∃-intro ₁ (∃-intro g λ i → (∧-intro (fact₀ i) (fact₁ i))) where g : ℕ → ℕ g 0 = 0 + f 0 g(succ i) = let j = g i + 1 in j + f j fact₀ : ∀(i : ℕ) → g i < g(i + 1) fact₀ i = let n = f(g i + 1) in ∃-intro n (trivial-addition-rearrangement (g i) n 1) fact₁ : ∀(i : ℕ) → K(α(g i) ≡ ₁) fact₁ 0 = h 0 fact₁ (succ i) = h(g i + 1)