Source code on Githubopen import Prelude.Init; open SetAsType
open import Prelude.DecEq
open import Prelude.General
open import Prelude.Closures
open import Prelude.InferenceRules
open import Prelude.Decidable
open import Prelude.Membership
open import Prelude.Setoid
open import Prelude.Bifunctor
open import Prelude.Measurable
open import Prelude.Ord
open import Prelude.InfEnumerable
module ULC.Measure (Atom : Type) ⦃ _ : DecEq Atom ⦄ ⦃ _ : Enumerable∞ Atom ⦄ where
open import ULC.Base Atom
open import Nominal Atom
private variable A : Type ℓ
instance
Measurable-Abs : ⦃ Measurable A ⦄ → Measurable (Abs A)
Measurable-Abs .∣_∣ (abs _ t) = suc ∣ t ∣
Measurable-Shape : Measurable TermShape
Measurable-Shape .∣_∣ = λ where
`∎ → 1
(l · r) → ∣ l ∣ + ∣ r ∣
(ƛ s) → suc ∣ s ∣
Measurable-Term : Measurable Term
Measurable-Term .∣_∣ = ∣_∣ ∘ shape
swap≡ : ∀ (t : Term) → ∣ swap x y t ∣ ≡ ∣ t ∣
swap≡ = cong ∣_∣ ∘ sym ∘ swap-shape≡ _ _
conc≡ : ∀ (f : Abs Term) x → ∣ conc f x ∣ ≡ Nat.pred ∣ f ∣
conc≡ (abs x t) _ = swap≡ t
conc≺ : ∀ (f : Abs Term) x → ∣ conc f x ∣ ≺ ∣ f ∣
conc≺ f x rewrite conc≡ f x = Nat.≤-refl
measure⁺ : ∀ (t : Term) → ∣ t ∣ > 0
measure⁺ (` _) = s≤s z≤n
measure⁺ (l · m) with ∣ l ∣ | measure⁺ l | ∣ m ∣ | measure⁺ m
... | suc l′ | _ | suc m′ | _ = s≤s z≤n
measure⁺ (ƛ _) = s≤s z≤n
_·≺ˡ_ : ∀ (L M : Term) → L ≺ (L · M)
_ ·≺ˡ M = Nat.m<m+n _ (measure⁺ M)
_·≺ʳ_ : ∀ (L M : Term) → M ≺ (L · M)
L ·≺ʳ _ = Nat.m<n+m _ (measure⁺ L)