module Calf.Core.Cost where
open import Calf.Value
open import Calf.Value.Nat
open import Calf.Value.Unit
open import Cubical.Foundations.Prelude
open import Cubical.Data.Nat.Literals public
import Cubical.Data.Nat.Properties as Nat
module _ {A : Type} where
open import Algebra.Definitions {A = A} _β‘_ public
`_ = fromNat
opaque
β : π±
β = β
isSetβ : isSet β
isSetβ = isSetβ
0β : β
0β = 0
_+β_ : β β β β β
_+β_ = _+_
+β-identityΛ‘ : LeftIdentity 0β _+β_
+β-identityΛ‘ _ = refl
+β-identityΚ³ : RightIdentity 0β _+β_
+β-identityΚ³ = Nat.+-zero
+β-assoc : Associative _+β_
+β-assoc cβ cβ cβ = sym (Nat.+-assoc cβ cβ cβ)
+β-comm : Commutative _+β_
+β-comm cβ cβ = Nat.+-comm cβ cβ
βββ : β β β
βββ n = ` n
instance
fromNatβ : HasFromNat β
fromNatβ = record { Constraint = Ξ» _ β β€ ; fromNat = Ξ» n β βββ n }
variable
c c' cβ cβ : β
_β_ : β β β β β
zero β c = 0β
suc n β c = c +β (n β c)
β-+ : β n cβ cβ β n β (cβ +β cβ) β‘ (n β cβ) +β (n β cβ)
β-+ zero cβ cβ = sym (+β-identityΛ‘ 0β)
β-+ (suc n) cβ cβ =
suc n β (cβ +β cβ)
β‘β¨ cong ((cβ +β cβ) +β_) (β-+ n cβ cβ) β©
(cβ +β cβ) +β ((n β cβ) +β (n β cβ))
β‘β¨ +β-assoc cβ cβ ((n β cβ) +β (n β cβ)) β©
cβ +β (cβ +β ((n β cβ) +β (n β cβ)))
β‘β¨ cong (cβ +β_) (sym (+β-assoc cβ (n β cβ) (n β cβ))) β©
cβ +β ((cβ +β (n β cβ)) +β (n β cβ))
β‘β¨ cong (Ξ» c β cβ +β (c +β (n β cβ))) (+β-comm cβ (n β cβ)) β©
cβ +β (((n β cβ) +β cβ) +β (n β cβ))
β‘β¨ cong (cβ +β_) (+β-assoc (n β cβ) cβ (n β cβ)) β©
cβ +β ((n β cβ) +β (cβ +β (n β cβ)))
β‘β¨ sym (+β-assoc cβ (n β cβ) (cβ +β (n β cβ))) β©
(suc n β cβ) +β (suc n β cβ)
β
β-+-left : β n m c β (n + m) β c β‘ (n β c) +β (m β c)
β-+-left zero m c = sym (+β-identityΛ‘ (m β c))
β-+-left (suc n) m c =
(suc n + m) β c
β‘β¨ cong (c +β_) (β-+-left n m c) β©
c +β ((n β c) +β (m β c))
β‘β¨ sym (+β-assoc c (n β c) (m β c)) β©
(suc n β c) +β (m β c)
β