Mercurial > hg > Members > kono > Proof > automaton1
view regular-language.agda @ 8:894feefc3084
subset construction lemma
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Sun, 15 Nov 2020 11:30:49 +0900 |
parents | 7399aae907fc |
children | 554fa6e5a09d |
line wrap: on
line source
{-# OPTIONS --allow-unsolved-metas #-} module regular-language where open import Level renaming ( suc to Suc ; zero to Zero ) open import Data.List hiding ([_]) -- open import Data.Nat hiding ( _≟_ ) -- open import Data.Bool -- open import Data.Fin hiding ( _+_ ) open import Data.Empty open import Data.Unit open import Data.Product open import Data.Maybe open import Relation.Nullary open import Relation.Binary.PropositionalEquality hiding ( [_] ) open import Relation.Binary.Definitions open import logic open import nat open import automaton -- open import finiteSet language : { Σ : Set } → Set (Suc Zero) language {Σ} = List Σ → Set open Automaton record RegularLanguage {n : Level} ( Σ : Set ) : Set (Level.suc n ) where field states : Set n astart : states automaton : Automaton states Σ contain : List Σ → Set contain x = accept automaton astart x split : {Σ : Set} → (List Σ → Set) → ( List Σ → Set) → List Σ → Set split x y [] = x [] ∧ y [] split x y (h ∷ t) = (x [] ∧ y (h ∷ t)) ∨ split (λ t1 → x ( h ∷ t1 )) (λ t2 → y t2 ) t Union : {Σ : Set} → ( A B : language {Σ} ) → language {Σ} Union {Σ} A B x = (A x ) ∨ (B x) Concat : {n : Level} {Σ : Set } → ( A B : language {Σ} ) → language {Σ} Concat {Σ} A B = split A B {-# TERMINATING #-} Star : {Σ : Set} → ( A : language {Σ} ) → language {Σ} Star {Σ} A = split A ( Star {Σ} A ) data In2 : Set where i0 : In2 i1 : In2 test-AB→split : {Σ : Set} → {A B : List In2 → Set} → split A B ( i0 ∷ i1 ∷ i0 ∷ [] ) ≡ ( ( A [] ∧ B ( i0 ∷ i1 ∷ i0 ∷ [] ) ) ∨ ( A ( i0 ∷ [] ) ∧ B ( i1 ∷ i0 ∷ [] ) ) ∨ ( A ( i0 ∷ i1 ∷ [] ) ∧ B ( i0 ∷ [] ) ) ∨ ( A ( i0 ∷ i1 ∷ i0 ∷ [] ) ∧ B [] ) ) test-AB→split {_} {A} {B} = refl open RegularLanguage isRegular : {n : Level} {Σ : Set} → (A : language {Σ} ) → ( x : List Σ ) → (r : RegularLanguage {n} Σ ) → Set isRegular A x r = A x ⇔ contain r x M-Union : {n : Level} {Σ : Set} → (A B : RegularLanguage {n} Σ ) → RegularLanguage Σ M-Union {n} {Σ} A B = record { states = states A × states B ; astart = ( astart A , astart B ) ; automaton = record { δ = λ q x → ( δ (automaton A) (proj₁ q) x , δ (automaton B) (proj₂ q) x ) ; F = λ q → ( F (automaton A) (proj₁ q) ∨ F (automaton B) (proj₂ q) ) } } open _∧_ closed-in-union : {n : Level} {Σ : Set} → (A B : RegularLanguage {n} Σ ) → ( x : List Σ ) → isRegular (Union (contain A) (contain B)) x ( M-Union A B ) closed-in-union A B [] = lemma where lemma : (F (automaton A) (astart A) ∨ F (automaton B) (astart B)) ⇔ (F (automaton A) (astart A) ∨ F (automaton B) (astart B)) lemma = [ id , id ] closed-in-union {n} {Σ} A B ( h ∷ t ) = lemma4 t ((δ (automaton A) (astart A) h)) ((δ (automaton B) (astart B) h)) where lemma4 : (t : List Σ) → (qa : states A ) → (qb : states B ) → (accept (automaton A) qa t ∨ accept (automaton B) qb t) ⇔ accept (automaton (M-Union A B)) (qa , qb) t lemma4 [] qa qb = [ id , id ] lemma4 (h ∷ t ) qa qb = lemma4 t ((δ (automaton A) qa h)) ((δ (automaton B) qb h)) -- closed-in-concat : {Σ : Set} → (A B : RegularLanguage Σ ) → ( x : List Σ ) → isRegular (Concat (contain A) (contain B)) x {!!} -- closed-in-concat = {!!}