summaryrefslogtreecommitdiff
path: root/src/Cfe/Language/Construct/Concatenate.agda
blob: 29e635d454c50eda15c67f3abf8d931f54b1b71e (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
{-# OPTIONS --without-K --safe #-}

open import Relation.Binary
import Cfe.Language

module Cfe.Language.Construct.Concatenate
  {c ℓ a aℓ b bℓ} (over : Setoid c ℓ)
  (A : Cfe.Language.Language over a aℓ)
  (B : Cfe.Language.Language over b bℓ)
  where

open import Data.Empty
open import Data.List
open import Data.List.Relation.Binary.Equality.Setoid over
open import Data.Product as Product
open import Function
open import Level
open import Cfe.Language over

open Setoid over renaming (Carrier to C)

infix 4 _≈ᶜ_
infix 4 _∙_

Concat : List C → Set (c ⊔ ℓ ⊔ a ⊔ b)
Concat l = ∃[ l₁ ] l₁ ∈ A × ∃[ l₂ ] l₂ ∈ B ×  l₁ ++ l₂ ≋ l

_≈ᶜ_ : {l₁ l₂ : List C} → REL (Concat l₁) (Concat l₂) (aℓ ⊔ bℓ)
(_ , l₁∈A , _ , l₂∈B , _) ≈ᶜ (_ , l₁′∈A , _ , l₂′∈B , _) = (≈ᴸ A l₁∈A l₁′∈A) × (≈ᴸ B l₂∈B l₂′∈B)

_∙_ : Language (c ⊔ ℓ ⊔ a ⊔ b) (aℓ ⊔ bℓ)
_∙_ = record
  { Carrier = Concat
  ; _≈_ = _≈ᶜ_
  ; isEquivalence = record
    { refl = ≈ᴸ-refl A , ≈ᴸ-refl B
    ; sym = Product.map (≈ᴸ-sym A) (≈ᴸ-sym B)
    ; trans = Product.zip (≈ᴸ-trans A) (≈ᴸ-trans B)
    }
  }