module Coexp.Prelude where open import Function open import Relation.Binary.PropositionalEquality postulate TODO : ∀ {a} {A : Set a} -> A {-# BUILTIN REWRITE _≡_ #-} module _ where postulate I : Set i0 i1 : I seg : i0 ≡ i1 module _ {p} {P : Set p} where postulate I-rec : (p0 p1 : P) (p : p0 ≡ p1) -> I -> P I-rec-i0 : ∀ {p0} {p1} {p} -> I-rec p0 p1 p i0 ≡ p0 {-# REWRITE I-rec-i0 #-} I-rec-i1 : ∀ {p0} {p1} {p} -> I-rec p0 p1 p i1 ≡ p1 {-# REWRITE I-rec-i1 #-} I-rec-seg : ∀ {p0} {p1} {p} -> cong (I-rec p0 p1 p) seg ≡ p funext : ∀ {a b} {A : Set a} {B : Set b} {f g : A -> B} -> ((x : A) -> f x ≡ g x) -> f ≡ g funext {f = f} {g = g} H = cong (flip \a -> I-rec (f a) (g a) (H a)) seg happly : ∀ {a b} {A : Set a} {B : Set b} {f g : A -> B} -> f ≡ g -> (x : A) -> f x ≡ g x happly p x = cong (_$ x) p happly-funext : ∀ {a b} {A : Set a} {B : Set b} {f g : A -> B} (H : (x : A) -> f x ≡ g x) -> ∀ x -> happly (funext H) x ≡ H x happly-funext {f = f} {g = g} H x = happly (funext H) x ≡⟨ refl ⟩ cong (_$ x) (cong (flip \a -> I-rec (f a) (g a) (H a)) seg) ≡⟨ sym (cong-∘ seg) ⟩ cong ((_$ x) ∘ (flip \a -> I-rec (f a) (g a) (H a))) seg ≡⟨ I-rec-seg ⟩ H x ∎ where open ≡-Reasoning open import Data.Nat recNat : ∀ {a} {A : Set a} -> A -> (A -> A) -> ℕ -> A recNat a f zero = a recNat a f (suc n) = f (recNat a f n) primNat : ∀ {a} {A : Set a} -> A -> (ℕ -> A -> A) -> ℕ -> A primNat a f zero = a primNat a f (suc n) = f n (primNat a f n) precNat : ∀ {a} {A : Set a} -> A -> (ℕ -> A -> A) -> ℕ -> A precNat a f n = recNat a (f n) n