summaryrefslogtreecommitdiff
path: root/src/Cfe/Expression/Base.agda
blob: 933b3bbd2b8677cd230f5fbb2cf288978a2bd4e3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
{-# OPTIONS --without-K --safe #-}

open import Relation.Binary using (REL; Setoid)

module Cfe.Expression.Base
  {c ℓ} (over : Setoid c ℓ)
  where

open Setoid over using () renaming (Carrier to C)

open import Cfe.Language over renaming (_∙_ to _∙ˡ_; _≈_ to _≈ˡ_)
open import Data.Fin hiding (_+_; _<_)
open import Data.Nat hiding (_≟_; _⊔_)
open import Data.Vec
open import Function using (_on_)
open import Relation.Nullary using (yes; no)

private
  variable
    m n : ℕ

------------------------------------------------------------------------
-- Definition

infix 8 μ_
infix 7 _∙_
infix 6 _∨_

data Expression : ℕ → Set c where
  ⊥    : 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 j ⟧   γ = lookup γ j
⟦ μ 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 j)   i = Var (punchIn i j)
wkn (μ e)     i = μ wkn e (suc i)

_[_/_] : 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 ≟ 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 _<ᵣₐₙₖ_

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′