{-# OPTIONS --exact-split #-}
{-# OPTIONS --no-sized-types #-}
{-# OPTIONS --no-universe-polymorphism #-}
{-# OPTIONS --without-K #-}
module LTC-PCF.Data.Nat.Inequalities.ConversionRules where
open import Common.FOL.Relation.Binary.EqReasoning
open import LTC-PCF.Base
open import LTC-PCF.Data.Nat.Inequalities
private
lt-s₁ : D → D → D
lt-s₁ m n = lth (fix lth) · m · n
lt-s₂ : D → D
lt-s₂ m = lam (λ n →
if (iszero₁ n)
then false
else (if (iszero₁ m)
then true
else (fix lth · pred₁ m · pred₁ n)))
lt-s₃ : D → D → D
lt-s₃ m n = if (iszero₁ n)
then false
else (if (iszero₁ m)
then true
else (fix lth · pred₁ m · pred₁ n))
lt-s₄ : D → D → D → D
lt-s₄ m n b = if b
then false
else (if (iszero₁ m)
then true
else (fix lth · pred₁ m · pred₁ n))
lt-s₅ : D → D → D
lt-s₅ m n = if (iszero₁ m) then true else (fix lth · pred₁ m · pred₁ n)
lt-s₆ : D → D → D → D
lt-s₆ m n b = if b then true else (fix lth · pred₁ m · pred₁ n)
lt-s₇ : D → D → D
lt-s₇ m n = fix lth · pred₁ m · pred₁ n
lt-s₈ : D → D → D
lt-s₈ m n = fix lth · m · pred₁ n
lt-s₉ : D → D → D
lt-s₉ m n = fix lth · m · n
proof₀₋₁ : ∀ m n → fix lth · m · n ≡ lt-s₁ m n
proof₀₋₁ m n = subst (λ x → x · m · n ≡ lth (fix lth) · m · n)
(sym (fix-eq lth))
refl
proof₁₋₂ : ∀ m n → lt-s₁ m n ≡ lt-s₂ m · n
proof₁₋₂ m n = subst (λ x → x · n ≡ lt-s₂ m · n)
(sym (beta lt-s₂ m))
refl
proof₂₋₃ : ∀ m n → lt-s₂ m · n ≡ lt-s₃ m n
proof₂₋₃ m n = beta (lt-s₃ m) n
proof₃₋₄ : ∀ m n b → iszero₁ n ≡ b → lt-s₃ m n ≡ lt-s₄ m n b
proof₃₋₄ m n .(iszero₁ n) refl = refl
proof₄₊ : ∀ m n → lt-s₄ m n true ≡ false
proof₄₊ m n = if-true false
proof₄₋₅ : ∀ m n → lt-s₄ m n false ≡ lt-s₅ m n
proof₄₋₅ m n = if-false (lt-s₅ m n)
proof₅₋₆ : ∀ m n b → iszero₁ m ≡ b → lt-s₅ m n ≡ lt-s₆ m n b
proof₅₋₆ m n .(iszero₁ m) refl = refl
proof₆₊ : ∀ m n → lt-s₆ m n true ≡ true
proof₆₊ m n = if-true true
proof₆₋₇ : ∀ m n → lt-s₆ m n false ≡ lt-s₇ m n
proof₆₋₇ m n = if-false (lt-s₇ m n)
proof₇₋₈ : ∀ m n → lt-s₇ (succ₁ m) n ≡ lt-s₈ m n
proof₇₋₈ m n = subst (λ x → lt-s₈ x n ≡ lt-s₈ m n)
(sym (pred-S m))
refl
proof₈₋₉ : ∀ m n → lt-s₈ m (succ₁ n) ≡ lt-s₉ m n
proof₈₋₉ m n = subst (λ x → lt-s₉ m x ≡ lt-s₉ m n)
(sym (pred-S n))
refl
private
X≮0 : ∀ n → n ≮ zero
X≮0 n = fix lth · n · zero ≡⟨ proof₀₋₁ n zero ⟩
lt-s₁ n zero ≡⟨ proof₁₋₂ n zero ⟩
lt-s₂ n · zero ≡⟨ proof₂₋₃ n zero ⟩
lt-s₃ n zero ≡⟨ proof₃₋₄ n zero true iszero-0 ⟩
lt-s₄ n zero true ≡⟨ proof₄₊ n zero ⟩
false ∎
lt-00 : zero ≮ zero
lt-00 = X≮0 zero
lt-0S : ∀ n → zero < succ₁ n
lt-0S n =
fix lth · zero · (succ₁ n) ≡⟨ proof₀₋₁ zero (succ₁ n) ⟩
lt-s₁ zero (succ₁ n) ≡⟨ proof₁₋₂ zero (succ₁ n) ⟩
lt-s₂ zero · (succ₁ n) ≡⟨ proof₂₋₃ zero (succ₁ n) ⟩
lt-s₃ zero (succ₁ n) ≡⟨ proof₃₋₄ zero (succ₁ n) false (iszero-S n) ⟩
lt-s₄ zero (succ₁ n) false ≡⟨ proof₄₋₅ zero (succ₁ n) ⟩
lt-s₅ zero (succ₁ n) ≡⟨ proof₅₋₆ zero (succ₁ n) true iszero-0 ⟩
lt-s₆ zero (succ₁ n) true ≡⟨ proof₆₊ zero (succ₁ n) ⟩
true ∎
lt-S0 : ∀ n → succ₁ n ≮ zero
lt-S0 n = X≮0 (succ₁ n)
lt-SS : ∀ m n → lt (succ₁ m) (succ₁ n) ≡ lt m n
lt-SS m n =
fix lth · (succ₁ m) · (succ₁ n) ≡⟨ proof₀₋₁ (succ₁ m) (succ₁ n) ⟩
lt-s₁ (succ₁ m) (succ₁ n) ≡⟨ proof₁₋₂ (succ₁ m) (succ₁ n) ⟩
lt-s₂ (succ₁ m) · (succ₁ n) ≡⟨ proof₂₋₃ (succ₁ m) (succ₁ n) ⟩
lt-s₃ (succ₁ m) (succ₁ n) ≡⟨ proof₃₋₄ (succ₁ m) (succ₁ n) false (iszero-S n) ⟩
lt-s₄ (succ₁ m) (succ₁ n) false ≡⟨ proof₄₋₅ (succ₁ m) (succ₁ n) ⟩
lt-s₅ (succ₁ m) (succ₁ n) ≡⟨ proof₅₋₆ (succ₁ m) (succ₁ n) false (iszero-S m) ⟩
lt-s₆ (succ₁ m) (succ₁ n) false ≡⟨ proof₆₋₇ (succ₁ m) (succ₁ n) ⟩
lt-s₇ (succ₁ m) (succ₁ n) ≡⟨ proof₇₋₈ m (succ₁ n) ⟩
lt-s₈ m (succ₁ n) ≡⟨ proof₈₋₉ m n ⟩
lt-s₉ m n ∎