From 49a2df1e3a210cd8be69afb33f8a3b5e20e41129 Mon Sep 17 00:00:00 2001 From: Chloe Brown Date: Mon, 5 Apr 2021 20:18:53 +0100 Subject: Clean up the Expression hierarchy. --- src/Cfe/Expression/Base.agda | 155 ++++++++++++++++++++----------------------- 1 file changed, 73 insertions(+), 82 deletions(-) (limited to 'src/Cfe/Expression/Base.agda') diff --git a/src/Cfe/Expression/Base.agda b/src/Cfe/Expression/Base.agda index 1cd57a7..f37694b 100644 --- a/src/Cfe/Expression/Base.agda +++ b/src/Cfe/Expression/Base.agda @@ -1,104 +1,95 @@ {-# OPTIONS --without-K --safe #-} -open import Function -open import Relation.Binary -import Relation.Binary.PropositionalEquality as ≔ +open import Relation.Binary using (REL; Setoid) module Cfe.Expression.Base {c ā„“} (over : Setoid c ā„“) where -open Setoid over renaming (Carrier to C) +open Setoid over using () renaming (Carrier to C) -open import Cfe.Language over as š•ƒ -open import Cfe.Language.Construct.Concatenate over renaming (_āˆ™_ to _āˆ™ā‚—_) -open import Cfe.Language.Construct.Single over -open import Cfe.Language.Construct.Union over -open import Cfe.Language.Indexed.Construct.Iterate over -open import Data.Fin as F hiding (_≤_; cast) -open import Data.Nat as ā„• hiding (_≤_; _āŠ”_) -open import Data.Product +open import Cfe.Language over renaming (_āˆ™_ to _āˆ™Ė”_; _ā‰ˆ_ to _ā‰ˆĖ”_) +open import Data.Fin hiding (_+_; _<_) +open import Data.Nat hiding (_ā‰Ÿ_; _āŠ”_) open import Data.Vec -open import Level renaming (suc to lsuc) hiding (Lift) -open import Relation.Binary.PropositionalEquality -open import Relation.Nullary +open import Function using (_on_) +open import Relation.Nullary using (yes; no) -infix 10 _[_/_] +private + variable + m n : ā„• + +------------------------------------------------------------------------ +-- Definition + +infix 8 μ_ infix 7 _āˆ™_ infix 6 _∨_ -infix 4 _≋_ data Expression : ā„• → Set c where - ⊄ : āˆ€ {n} → Expression n - ε : āˆ€ {n} → Expression n - Char : āˆ€ {n} → C → Expression n - _∨_ : āˆ€ {n} → Expression n → Expression n → Expression n - _āˆ™_ : āˆ€ {n} → Expression n → Expression n → Expression n - Var : āˆ€ {n} → Fin n → Expression n - μ : āˆ€ {n} → Expression (suc n) → Expression n - -cast : āˆ€ {m n} → .(_ : m ≔ n) → Expression m → Expression n -cast eq ⊄ = ⊄ -cast eq ε = ε -cast eq (Char x) = Char x -cast eq (e₁ ∨ eā‚‚) = cast eq e₁ ∨ cast eq eā‚‚ -cast eq (e₁ āˆ™ eā‚‚) = cast eq e₁ āˆ™ cast eq eā‚‚ -cast eq (Var i) = Var (F.cast eq i) -cast eq (μ e) = μ (cast (cong suc eq) e) - -wkn : āˆ€ {n} → Expression n → Fin (suc n) → Expression (suc n) -wkn ⊄ i = ⊄ -wkn ε i = ε -wkn (Char x) i = Char x + ⊄ : Expression n + ε : Expression n + Char : (c : C) → Expression n + _∨_ : Expression n → Expression n → Expression n + _āˆ™_ : Expression n → Expression n → Expression n + Var : (j : Fin n) → Expression n + μ_ : Expression (suc n) → Expression n + +------------------------------------------------------------------------ +-- Semantics + +infix 4 _ā‰ˆ_ + +⟦_⟧ : Expression n → Vec (Language _) n → Language _ +⟦ ⊄ ⟧ _ = āˆ… +⟦ ε ⟧ _ = ļ½›Īµļ½ {ā„“} +⟦ Char x ⟧ _ = ļ½› x ļ½ +⟦ e₁ ∨ eā‚‚ ⟧ γ = ⟦ e₁ ⟧ γ ∪ ⟦ eā‚‚ ⟧ γ +⟦ e₁ āˆ™ eā‚‚ ⟧ γ = ⟦ e₁ ⟧ γ āˆ™Ė” ⟦ eā‚‚ ⟧ γ +⟦ Var n ⟧ γ = lookup γ n +⟦ μ e ⟧ γ = ā‹ƒ (Ī» X → ⟦ e ⟧ (X ∷ γ)) + +_ā‰ˆ_ : {n : ā„•} → Expression n → Expression n → Set _ +e₁ ā‰ˆ eā‚‚ = āˆ€ γ → ⟦ e₁ ⟧ γ ā‰ˆĖ” ⟦ eā‚‚ ⟧ γ + +------------------------------------------------------------------------ +-- Syntax manipulation + +infix 10 _[_/_] + +wkn : Expression n → Fin (suc n) → Expression (suc n) +wkn ⊄ i = ⊄ +wkn ε i = ε +wkn (Char c) i = Char c wkn (e₁ ∨ eā‚‚) i = wkn e₁ i ∨ wkn eā‚‚ i wkn (e₁ āˆ™ eā‚‚) i = wkn e₁ i āˆ™ wkn eā‚‚ i -wkn (Var x) i = Var (punchIn i x) -wkn (μ e) i = μ (wkn e (suc i)) +wkn (Var j) i = Var (punchIn i j) +wkn (μ e) i = μ wkn e (suc i) -_[_/_] : āˆ€ {n} → Expression (suc n) → Expression n → Fin (suc n) → Expression n -⊄ [ e′ / i ] = ⊄ -ε [ e′ / i ] = ε -Char x [ e′ / i ] = Char x +_[_/_] : Expression (suc n) → Expression n → Fin (suc n) → Expression n +⊄ [ e′ / i ] = ⊄ +ε [ e′ / i ] = ε +Char x [ e′ / i ] = Char x (e₁ ∨ eā‚‚) [ e′ / i ] = e₁ [ e′ / i ] ∨ eā‚‚ [ e′ / i ] (e₁ āˆ™ eā‚‚) [ e′ / i ] = e₁ [ e′ / i ] āˆ™ eā‚‚ [ e′ / i ] -Var j [ e′ / i ] with i F.ā‰Ÿ j -... | yes i≔j = e′ -... | no i≢j = Var (punchOut i≢j) -μ e [ e′ / i ] = μ (e [ wkn e′ F.zero / suc i ]) - -rotate : āˆ€ {n} → Expression n → (i j : Fin n) → .(_ : i F.≤ j) → Expression n -rotate ⊄ _ _ _ = ⊄ -rotate ε _ _ _ = ε -rotate (Char x) _ _ _ = Char x -rotate (e₁ ∨ eā‚‚) i j i≤j = rotate e₁ i j i≤j ∨ rotate eā‚‚ i j i≤j -rotate (e₁ āˆ™ eā‚‚) i j i≤j = rotate e₁ i j i≤j āˆ™ rotate eā‚‚ i j i≤j -rotate {suc n} (Var k) i j _ with i F.ā‰Ÿ k -... | yes i≔k = Var j -... | no i≢k = Var (punchIn j (punchOut i≢k)) -rotate (μ e) i j i≤j = μ (rotate e (suc i) (suc j) (s≤s i≤j)) - -⟦_⟧ : āˆ€ {n : ā„•} → Expression n → Vec (Language (c āŠ” ā„“)) n → Language (c āŠ” ā„“) -⟦ ⊄ ⟧ _ = Lift (c āŠ” ā„“) āˆ… -⟦ ε ⟧ _ = Lift ā„“ ļ½›Īµļ½ -⟦ Char x ⟧ _ = Lift ā„“ ļ½› x ļ½ -⟦ e₁ ∨ eā‚‚ ⟧ γ = ⟦ e₁ ⟧ γ ∪ ⟦ eā‚‚ ⟧ γ -⟦ e₁ āˆ™ eā‚‚ ⟧ γ = ⟦ e₁ ⟧ γ āˆ™ā‚— ⟦ eā‚‚ ⟧ γ -⟦ Var n ⟧ γ = lookup γ n -⟦ μ e ⟧ γ = ā‹ƒ (Ī» X → ⟦ e ⟧ (X ∷ γ)) - -_≋_ : {n : ā„•} → Expression n → Expression n → Set (lsuc (c āŠ” ā„“)) -e₁ ≋ eā‚‚ = āˆ€ γ → ⟦ e₁ ⟧ γ š•ƒ.ā‰ˆ ⟦ eā‚‚ ⟧ γ - -rank : {n : ā„•} → Expression n → ā„• -rank ⊄ = 0 -rank ε = 0 -rank (Char _) = 0 -rank (e₁ ∨ eā‚‚) = suc (rank e₁ ā„•.+ rank eā‚‚) -rank (e₁ āˆ™ _) = suc (rank e₁) -rank (Var _) = 0 -rank (μ e) = suc (rank e) +Var j [ e′ / i ] with i ā‰Ÿ j +... | yes i≔j = e′ +... | no i≢j = Var (punchOut i≢j) +(μ e) [ e′ / i ] = μ e [ wkn e′ zero / suc i ] + +------------------------------------------------------------------------ +-- Syntax properties infix 4 _<ᵣₐₙₖ_ -_<ᵣₐₙₖ_ : āˆ€ {n} → Rel (Expression n) _ -_<ᵣₐₙₖ_ = ā„•._<_ on rank +rank : Expression n → ā„• +rank ⊄ = 0 +rank ε = 0 +rank (Char _) = 0 +rank (e₁ ∨ eā‚‚) = suc (rank e₁ + rank eā‚‚) +rank (e₁ āˆ™ _) = suc (rank e₁) +rank (Var _) = 0 +rank (μ e) = suc (rank e) + +_<ᵣₐₙₖ_ : REL (Expression m) (Expression n) _ +e <ᵣₐₙₖ e′ = rank e < rank e′ -- cgit v1.2.3