module K-DC where

open import Logic
open import JK-LogicalFacts
open import Naturals
open import Addition
open import JK-Monads
open import Choice
open import Equality
open import K-Shift

-------------------------------------------------------------
--                                                         --
-- The K-translation of dependent choice of ground type.   --
--                                                         --
-------------------------------------------------------------

K-∀-double-shift : {R : Ω} {P :       Ω} 
---------------
     (∀(n : )  ∀(x : )  R   \(y : )  P n x y)   -- efqs
     (∀(n : )  ∀(x : )  K∃ \(y : )  P n x y)      -- premise
     K(∀(n : )  ∀(x : )   \(y : )  P n x y)       -- conclusion

K-∀-double-shift {R} {P} efqs f
  = K-∀-shift {R} efqs'  n  K-∀-shift (efqs n) (f n))
 where
  efqs' : (∀(n : )  R  ∀(x : )   \(y : )  P n x y)
  efqs' n r x = efqs n x r


K-DC-ℕ : {R : Ω} {P :       Ω} 
-------
    (∀(n : )  ∀(x : )  R   \(y : )  P n x y)
   ∀(x₀ : )
  (∀(n : )  ∀(x : )  K∃ \(y : )  P n x y)
  K∃ \(α :   )  α O  x₀  (∀(n : )  P n (α n) (α(n + 1)))

K-DC-ℕ efqs x₀ f = (K-functor (DC x₀)) (K-∀-double-shift efqs f)