summaryrefslogtreecommitdiff
path: root/src/Cfe/Derivation/Base.agda
blob: 373b6b53abf7355da3963832a9a73ec3b23d5193 (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
{-# OPTIONS --without-K --safe #-}

open import Relation.Binary using (REL; Setoid)

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

open Setoid over renaming (Carrier to C; _≈_ to _∼_)

open import Cfe.Expression over hiding (_≈_)
open import Data.Fin using (zero)
open import Data.List using (List; []; [_]; _++_)
open import Data.List.Relation.Binary.Equality.Setoid over using (_≋_)
open import Level using (_⊔_)
open import Relation.Binary.Core using (Rel)

infix 5 _⤇_
infix 4 _≈_

data _⤇_ : Expression 0 → List C → Set (c ⊔ ℓ) where
  Eps  : ε ⤇ []
  Char : ∀ {c y} → (c∼y : c ∼ y) → Char c ⤇ [ y ]
  Cat  : ∀ {e₁ e₂ w₁ w₂ w} → e₁ ⤇ w₁ → e₂ ⤇ w₂ → w₁ ++ w₂ ≋ w → e₁ ∙ e₂ ⤇ w
  Veeˡ : ∀ {e₁ e₂ w} → e₁ ⤇ w → e₁ ∨ e₂ ⤇ w
  Veeʳ : ∀ {e₁ e₂ w} → e₂ ⤇ w → e₁ ∨ e₂ ⤇ w
  Fix  : ∀ {e w} → e [ μ e / zero ] ⤇ w → μ e ⤇ w

data _≈_ : ∀ {e w w′} → REL (e ⤇ w) (e ⤇ w′) (c ⊔ ℓ) where
  Eps  : Eps ≈ Eps
  Char : ∀ {c y y′} → (c∼y : c ∼ y) → (c∼y′ : c ∼ y′) → Char c∼y ≈ Char c∼y′
  Cat  :
    ∀ {e₁ e₂ w w′ w₁ w₂ w₁′ w₂′ e₁⤇w₁ e₁⤇w₁′ e₂⤇w₂ e₂⤇w₂′} →
    (e₁⤇w₁≈e₁⤇w′ : _≈_ {e₁} {w₁} {w₁′} e₁⤇w₁ e₁⤇w₁′) →
    (e₂⤇w₂≈e₂⤇w′ : _≈_ {e₂} {w₂} {w₂′} e₂⤇w₂ e₂⤇w₂′) →
    (eq : w₁ ++ w₂ ≋ w) → (eq′ : w₁′ ++ w₂′ ≋ w′) →
    Cat e₁⤇w₁ e₂⤇w₂ eq ≈ Cat e₁⤇w₁′ e₂⤇w₂′ eq′
  Veeˡ :
    ∀ {e₁ e₂ w w′ e₁⤇w e₁⤇w′} →
    (e₁⤇w≈e₁⤇w′ : _≈_ {e₁} {w} {w′} e₁⤇w e₁⤇w′) →
    Veeˡ {e₂ = e₂} e₁⤇w ≈ Veeˡ e₁⤇w′
  Veeʳ :
    ∀ {e₁ e₂ w w′ e₂⤇w e₂⤇w′} →
    (e₂⤇w≈e₂⤇w′ : _≈_ {e₂} {w} {w′} e₂⤇w e₂⤇w′) →
    Veeʳ {e₁} e₂⤇w ≈ Veeʳ e₂⤇w′
  Fix  :
    ∀ {e w w′ e[μe/0]⤇w e[μe/0]⤇w′} →
    (e[μe/0]⤇w≈e[μe/0]⤇w′ : _≈_ {e [ μ e / zero ]} {w} {w′} e[μe/0]⤇w e[μe/0]⤇w′) →
    Fix {e} e[μe/0]⤇w ≈ Fix e[μe/0]⤇w′