module Chapter6.Functions.Examples.Le where
open import Data.Unit
open import Data.Fin hiding (_<_ ; fold)
open import Data.Product
open import Relation.Binary.PropositionalEquality
open import Chapter2.IDesc.Fixpoint
open import Chapter2.IDesc.Lifting
open import Chapter2.IDesc.InitialAlgebra
open import Chapter2.IDesc.Induction
open import Chapter2.IDesc.Examples.Nat
open import Chapter2.IDesc.Examples.Bool
open import Chapter6.Functions
type< : Type
type< = μ NatD [ tt ]→ μ NatD [ tt ]→ μ BoolD [ tt ]× `⊤
infix 40 _<_
β : (Nat → Bool × ⊤) → DAlg NatD (λ _ → Bool × ⊤)
β <n {i}{zero , tt} _ = true , tt
β <n {i}{suc zero , m , tt} _ = <n m
β <n {i}{suc (suc ()) , _} _
α : DAlg NatD (λ _ → Nat → Bool × ⊤)
α {i} {zero , tt} tt = λ m → false , tt
α {i} {suc zero , n , tt} (<n , tt) =
induction NatD (λ _ → Bool × ⊤) (λ {i}{xs} → β <n {i}{xs})
α {i} {suc (suc ()) , _} _
_<_ : ⟦ type< ⟧Type
m < n = induction NatD (λ _ → Nat → Bool × ⊤) (λ {i}{xs} → α {i}{xs}) n m
private
module Test where
test-m<0 : ∀{m} → m < ze ≡ false , tt
test-m<0 = refl
test-0<su : ∀{n} → ze < su n ≡ true , tt
test-0<su = refl
test-su<suze : ∀{m} → su m < su ze ≡ false , tt
test-su<suze = refl
test-suze<su : ∀{n} → su ze < su (su n) ≡ true , tt
test-suze<su = refl