open import Tools.Bool
open import Tools.Unit
module Graded.Modality.Instances.Unit where
open import Tools.Empty
open import Tools.Function
open import Tools.Level
open import Tools.Product
open import Tools.PropositionalEquality
open import Tools.Relation
open import Tools.Sum
open import Tools.Algebra ⊤
open import Graded.Modality ⊤ public
open import Graded.Mode.Instances.Zero-one.Variant
open import Graded.Mode.Instances.Zero-one hiding (_≟_)
import Graded.Modality.Properties.Star as Star
open import Graded.Modality.Properties.Subtraction
open import Graded.FullReduction.Assumptions
open import Graded.Usage.Restrictions
open import Definition.Typed.Restrictions
_+_ : Op₂ ⊤
_ + _ = tt
infixr 20 _+_
_⊛_▷_ : Op₃ ⊤
_ ⊛ _ ▷ _ = tt
infix 10 _≟_
_≟_ : Decidable (_≡_ {A = ⊤})
_ ≟ _ = yes refl
+-Commutative : Commutative _+_
+-Commutative x y = refl
+-Associative : Associative _+_
+-Associative x y z = refl
+-Distributiveˡ : _+_ DistributesOverˡ _+_
+-Distributiveˡ x y z = refl
+-Distributiveʳ : _+_ DistributesOverʳ _+_
+-Distributiveʳ x y z = refl
+-LeftIdentity : LeftIdentity tt _+_
+-LeftIdentity tt = refl
+-RightIdentity : RightIdentity tt _+_
+-RightIdentity tt = refl
+-Identity : Identity tt _+_
+-Identity = +-LeftIdentity , +-RightIdentity
+-Idempotent : Idempotent _+_
+-Idempotent tt = refl
+-Magma : IsMagma _+_
+-Magma = record
{ isEquivalence = isEquivalence
; ∙-cong = cong₂ _+_
}
+-Semigroup : IsSemigroup _+_
+-Semigroup = record
{ isMagma = +-Magma
; assoc = +-Associative
}
+-Monoid : IsMonoid _+_ tt
+-Monoid = record
{ isSemigroup = +-Semigroup
; identity = +-Identity
}
+-CommutativeMonoid : IsCommutativeMonoid _+_ tt
+-CommutativeMonoid = record
{ isMonoid = +-Monoid
; comm = +-Commutative
}
+-Band : IsBand _+_
+-Band = record
{ isSemigroup = +-Semigroup
; idem = +-Idempotent
}
+-Semilattice : IsMeetSemilattice _+_
+-Semilattice = record
{ isBand = +-Band
; comm = +-Commutative
}
+-+-SemiringWithoutAnnihilatingZero : IsSemiringWithoutAnnihilatingZero _+_ _+_ tt tt
+-+-SemiringWithoutAnnihilatingZero = record
{ +-isCommutativeMonoid = +-CommutativeMonoid
; *-cong = cong₂ _+_
; *-assoc = +-Associative
; *-identity = +-Identity
; distrib = +-Distributiveˡ , +-Distributiveʳ
}
+-+-Semiring : IsSemiring _+_ _+_ tt tt
+-+-Semiring = record
{ isSemiringWithoutAnnihilatingZero = +-+-SemiringWithoutAnnihilatingZero
; zero = (λ x → refl) , (λ x → refl)
}
UnitModality : Modality
UnitModality = record
{ _+_ = _+_
; _·_ = _+_
; _∧_ = _+_
; 𝟘 = tt
; 𝟙 = tt
; ω = tt
; ω≤𝟙 = refl
; ω·+≤ω·ʳ = refl
; is-𝟘? = _≟ tt
; +-·-Semiring = +-+-Semiring
; ∧-Semilattice = +-Semilattice
; ·-distrib-∧ = +-Distributiveˡ , +-Distributiveʳ
; +-distrib-∧ = +-Distributiveˡ , +-Distributiveʳ
}
unit-has-star : Has-star UnitModality
unit-has-star = record
{ _⊛_▷_ = _⊛_▷_
; ⊛-ineq = (λ p q r → refl) , (λ p q r → refl)
; +-sub-interchangeable-⊛ = λ r p q p′ q′ → refl
; ·-sub-distribʳ-⊛ = λ r q p p′ → refl
; ⊛-sub-distrib-∧ = λ r → (λ p q q′ → refl) , (λ q p p′ → refl)
}
unit-has-nr : Has-nr UnitModality
unit-has-nr = Star.has-nr _ ⦃ has-star = unit-has-star ⦄
opaque
nr-linearity-like-for-𝟘 :
Has-nr.Linearity-like-nr-for-𝟘 unit-has-nr
nr-linearity-like-for-𝟘 = refl
opaque
nr-linearity-like-for-𝟙 :
Has-nr.Linearity-like-nr-for-𝟙 unit-has-nr
nr-linearity-like-for-𝟙 = refl
opaque
unit-supports-glb-for-nr :
Has-well-behaved-GLBs UnitModality
unit-supports-glb-for-nr = record
{ +-GLBˡ = λ _ → (λ _ → refl) , λ _ _ → refl
; ·-GLBˡ = λ _ → (λ _ → refl) , λ _ _ → refl
; ·-GLBʳ = λ _ → (λ _ → refl) , λ _ _ → refl
; +nrᵢ-GLB = λ _ _ → _ , ((λ _ → refl) , (λ _ _ → refl)) , refl
}
full-reduction-assumptions :
{mv : Mode-variant UnitModality} →
{rs : Type-restrictions UnitModality} →
{us : Usage-restrictions UnitModality (Zero-one-isMode mv)} →
Full-reduction-assumptions mv rs us
full-reduction-assumptions = record
{ sink⊎𝟙≤𝟘 = λ _ _ → inj₂ refl
; ≡𝟙⊎𝟙≤𝟘 = λ _ → inj₁ refl
}
opaque
unit-supports-subtraction : Supports-subtraction UnitModality
unit-supports-subtraction _ = _ , refl , λ _ _ → refl