# HG changeset patch # User Shinji KONO # Date 1605149134 -32400 # Node ID 9615a94b18cadf117168be7f50121942de295f6d new automaton in agda diff -r 000000000000 -r 9615a94b18ca Test.agda --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Test.agda Thu Nov 12 11:45:34 2020 +0900 @@ -0,0 +1,32 @@ +module Test where +open import Level +open import Relation.Nullary +open import Relation.Binary -- hiding (_⇔_ ) +open import Data.Empty +open import Data.Nat hiding ( _⊔_ ) + +id : ( A : Set ) → A → A +id A x = x + +id1 : { A : Set } → A → A +id1 x = x + + +test1 = id ℕ 1 +test2 = id1 1 + + + +data Bool : Set where + true : Bool + false : Bool + +record _∧_ {n m : Level} (A : Set n) ( B : Set m ) : Set (n ⊔ m) where + constructor ⟪_,_⟫ + field + proj1 : A + proj2 : B + +data _∨_ {n m : Level} (A : Set n) ( B : Set m ) : Set (n ⊔ m) where + case1 : A → A ∨ B + case2 : B → A ∨ B diff -r 000000000000 -r 9615a94b18ca automaton.agda --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/automaton.agda Thu Nov 12 11:45:34 2020 +0900 @@ -0,0 +1,217 @@ +{-# OPTIONS --allow-unsolved-metas #-} +module automaton where +open import Level hiding ( suc ; zero ) +open import Data.Empty +open import Relation.Nullary +open import Relation.Binary.PropositionalEquality -- hiding (_⇔_) +open import logic +open import Data.List + +record Automaton {n : Level} (Q : Set n) (Σ : Set ) : Set ((Level.suc n) ) where + field + δ : Q → Σ → Q + F : Q → Set + exists : (Q → Set) → Set + +open Automaton + +accept : {n : Level} {Q : Set n} {Σ : Set } → Automaton Q Σ → Q → List Σ → Set +accept {Q} {Σ} atm q [] = F atm q +accept {Q} {Σ} atm q (x ∷ input) = + accept atm (δ atm q x ) input + +trace : {n : Level} {Q : Set n} {Σ : Set } → (A : Automaton Q Σ) → (start : Q) → (input : List Σ ) → accept A start input → List Q +trace {n} {Q} {Σ} A q [] a = q ∷ [] +trace {n} {Q} {Σ} A q (x ∷ t) a = q ∷ ( trace A (δ A q x) t a ) + +data Q3 : Set where + q₁ : Q3 + q₂ : Q3 + q₃ : Q3 + +data Σ2 : Set where + s0 : Σ2 + s1 : Σ2 + +δ16 : Q3 → Σ2 → Q3 +δ16 q₁ s0 = q₁ +δ16 q₁ s1 = q₂ +δ16 q₂ s0 = q₃ +δ16 q₂ s1 = q₂ +δ16 q₃ s0 = q₂ +δ16 q₃ s1 = q₂ + +δ16' : Q3 → Σ2 → Q3 +δ16' q₁ s0 = q₁ +δ16' q₁ s1 = q₂ +δ16' q₂ s0 = q₃ +δ16' q₂ s1 = q₂ +δ16' q₃ s0 = q₂ +δ16' q₃ s1 = q₃ + +data a16end : Q3 → Set where + a16q2 : a16end q₂ + +data exists-in-Q3 (P : Q3 → Set) : Set where + qe1 : P q₁ → exists-in-Q3 P + qe2 : P q₂ → exists-in-Q3 P + qe3 : P q₃ → exists-in-Q3 P + +a16 : Automaton Q3 Σ2 +a16 = record { δ = δ16 ; F = λ q → a16end q ; exists = exists-in-Q3 } + +a16' : Automaton Q3 Σ2 +a16' = record { δ = δ16' ; F = λ q → q ≡ q₂ ; exists = exists-in-Q3 } + +-- +-- ∷ → ∷ → ∷ → [] +-- ↓ ↓ ↓ +-- s0 s0 s1 +-- +input1 : List Σ2 +input1 = s0 ∷ s0 ∷ s1 ∷ [] + +input2 : List Σ2 +input2 = s0 ∷ s0 ∷ s0 ∷ [] + +test1 : accept a16 q₁ input1 +test1 = a16q2 + +lemma0 : accept a16 q₁ input1 ≡ a16end q₂ +lemma0 = begin + accept a16 q₁ ( s0 ∷ s0 ∷ s1 ∷ [] ) + ≡⟨ refl ⟩ -- x ≡ x + accept a16 q₁ ( s0 ∷ s1 ∷ [] ) + ≡⟨⟩ + accept a16 q₁ ( s1 ∷ [] ) + ≡⟨⟩ + accept a16 q₂ [] + ≡⟨⟩ + a16end q₂ + ∎ where open ≡-Reasoning + +lemma1 : List Q3 +lemma1 = trace a16 q₁ input1 a16q2 + +test1' : accept a16' q₁ input1 +test1' = refl + +lemma2 : List Q3 +lemma2 = trace a16' q₁ input1 refl + +test2 : ¬ ( accept a16 q₁ input2 ) +test2 () + +open import Data.Bool +open import Data.Unit + +-- contains at least 1 s1 +c1 : List Σ2 → Set +c1 [] = ⊥ +c1 (s1 ∷ t) = ⊤ +c1 (_ ∷ t) = c1 t + +-- even number of s0 +even0 : List Σ2 → Set +odd0 : List Σ2 → Set +odd0 [] = ⊥ +odd0 (s0 ∷ t) = even0 t +odd0 (s1 ∷ t) = odd0 t +even0 [] = ⊤ +even0 (s0 ∷ t) = odd0 t +even0 (s1 ∷ t) = even0 t + +-- after + +a0 : List Σ2 → Set +a0 [] = ⊥ +a0 (s1 ∷ t ) = even0 t +a0 (s0 ∷ t ) = a0 t + +-- data ⊥ : Set +-- +-- data ⊤ : Set where +-- tt : ⊤ +-- tt : ⊤ + +lemma-a : (x : List Σ2 ) → accept a16' q₁ x → a0 x +lemma-a x a = a1 x a where + a3 : (x : List Σ2 ) → accept a16' q₃ x → odd0 x + a2 : (x : List Σ2 ) → accept a16' q₂ x → even0 x + a3 [] () + a3 (s0 ∷ t) a = a2 t a + a3 (s1 ∷ t) a = a3 t a + a2 [] a = tt + a2 (s0 ∷ t) a = a3 t a + a2 (s1 ∷ t) a = a2 t a + a1 : (x : List Σ2 ) → accept a16' q₁ x → a0 x + a1 [] () -- a16' does not accept [] + a1 (s0 ∷ t) a = a1 t a + a1 (s1 ∷ t) a = a2 t a + +-- ¬_ : Set → Set +-- ¬_ _ = ⊥ + +lemma-not-a : ¬ ( (x : List Σ2 ) → accept a16 q₁ x → a0 x ) +lemma-not-a not1 with not1 (s1 ∷ s0 ∷ s1 ∷ [] ) a16q2 +... | () + +-- can we prove negation similar to the lemma-a? +-- lemma-not-a' : ¬ ((x : List Σ2 ) → accept a16 q₁ x → a0 x) +-- lemma-not-a' not = {!!} where +-- a3 : (x : List Σ2 ) → accept a16 q₃ x → odd0 x +-- a2 : (x : List Σ2 ) → accept a16 q₂ x → even0 x +-- a3 (s0 ∷ t) a = a2 t a +-- a3 (s1 ∷ t) a = {!!} +-- a2 [] a = tt +-- a2 (s0 ∷ t) a = a3 t a +-- a2 (s1 ∷ t) a = a2 t a +-- a1 : (x : List Σ2 ) → accept a16 q₁ x → a0 x +-- a1 [] () +-- a1 (s0 ∷ t) a = a1 t a +-- a1 (s1 ∷ t) a = a2 t a + +open import Data.Nat + +evenℕ : ℕ → Set +oddℕ : ℕ → Set +oddℕ zero = ⊥ +oddℕ (suc n) = evenℕ n +evenℕ zero = ⊤ +evenℕ (suc n) = oddℕ n + +count-s0 : (x : List Σ2 ) → ℕ +count-s0 [] = zero +count-s0 (s0 ∷ t) = suc ( count-s0 t ) +count-s0 (s1 ∷ t) = count-s0 t + +e1 : (x : List Σ2 ) → even0 x → evenℕ ( count-s0 x ) +o1 : (x : List Σ2 ) → odd0 x → oddℕ ( count-s0 x ) +e1 [] e = tt +e1 (s0 ∷ t) o = o1 t o +e1 (s1 ∷ t) e = e1 t e +o1 [] () +o1 (s0 ∷ t) e = e1 t e +o1 (s1 ∷ t) o = o1 t o + +δ19 : Q3 → Σ2 → Q3 +δ19 q₁ s0 = q₁ +δ19 q₁ s1 = q₂ +δ19 q₂ s0 = q₁ +δ19 q₂ s1 = q₂ +δ19 q₃ _ = q₁ + +a19 : Automaton Q3 Σ2 +a19 = record { δ = δ19 ; F = λ q → q ≡ q₁ ; exists = exists-in-Q3 } + +-- input is empty or ends in s0 + +end0 : List Σ2 → Set +end0 [] = ⊤ +end0 (s0 ∷ [] ) = ⊤ +end0 (s1 ∷ [] ) = ⊥ +end0 (x ∷ t ) = end0 t + +lemma-b : (x : List Σ2 ) → accept a19 q₁ x → end0 x +lemma-b = {!!} + diff -r 000000000000 -r 9615a94b18ca finiteSet.agda --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/finiteSet.agda Thu Nov 12 11:45:34 2020 +0900 @@ -0,0 +1,536 @@ +{-# OPTIONS --allow-unsolved-metas #-} +module finiteSet where + +open import Data.Nat hiding ( _≟_ ) +open import Data.Fin renaming ( _<_ to _<<_ ) hiding (_≤_) +open import Data.Fin.Properties hiding ( eq? ) +open import Data.Empty +open import Data.Bool renaming ( _∧_ to _/\_ ; _∨_ to _\/_ ) hiding ( _≟_ ; _<_ ; _≤_ ) +open import Relation.Nullary +open import Relation.Binary.Definitions +open import Relation.Binary.PropositionalEquality +open import logic +open import nat +open import Data.Nat.Properties as NatP hiding ( _≟_ ; eq? ) + +open import Relation.Binary.HeterogeneousEquality as HE using (_≅_ ) + +record Found ( Q : Set ) (p : Q → Bool ) : Set where + field + found-q : Q + found-p : p found-q ≡ true + +lt0 : (n : ℕ) → n Data.Nat.≤ n +lt0 zero = z≤n +lt0 (suc n) = s≤s (lt0 n) +lt2 : {m n : ℕ} → m < n → m Data.Nat.≤ n +lt2 {zero} lt = z≤n +lt2 {suc m} {zero} () +lt2 {suc m} {suc n} (s≤s lt) = s≤s (lt2 lt) + +record FiniteSet ( Q : Set ) { n : ℕ } : Set where + field + Q←F : Fin n → Q + F←Q : Q → Fin n + finiso→ : (q : Q) → Q←F ( F←Q q ) ≡ q + finiso← : (f : Fin n ) → F←Q ( Q←F f ) ≡ f + finℕ : ℕ + finℕ = n + exists1 : (m : ℕ ) → m Data.Nat.≤ n → (Q → Bool) → Bool + exists1 zero _ _ = false + exists1 ( suc m ) m ¬a ¬b c = ⊥-elim ( nat-≤> mn = ⊥-elim (nat-≤> i>n (fin_ : Bool → Bool → Bool +true <=> true = true +false <=> false = true +_ <=> _ = false + +infixr 130 _\/_ +infixr 140 _/\_ diff -r 000000000000 -r 9615a94b18ca nat.agda --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nat.agda Thu Nov 12 11:45:34 2020 +0900 @@ -0,0 +1,290 @@ +{-# OPTIONS --allow-unsolved-metas #-} +module nat where + +open import Data.Nat +open import Data.Nat.Properties +open import Data.Empty +open import Relation.Nullary +open import Relation.Binary.PropositionalEquality +open import Relation.Binary.Definitions +-- open import Relation.Binary.Core +open import logic + + +nat-<> : { x y : ℕ } → x < y → y < x → ⊥ +nat-<> (s≤s x x : { x y : ℕ } → x ≤ y → y < x → ⊥ +nat-≤> (s≤s x x→¬< : {x y : ℕ } → (x < y ) → ¬ ( y < x ) +>→¬< (s≤s x→¬< x y → minus x y + y ≡ x +minus+n {x} {zero} _ = trans (sym (+-comm zero _ )) refl +minus+n {zero} {suc y} (s≤s ()) +minus+n {suc x} {suc y} (s≤s lt) = begin + minus (suc x) (suc y) + suc y + ≡⟨ +-comm _ (suc y) ⟩ + suc y + minus x y + ≡⟨ cong ( λ k → suc k ) ( + begin + y + minus x y + ≡⟨ +-comm y _ ⟩ + minus x y + y + ≡⟨ minus+n {x} {y} lt ⟩ + x + ∎ + ) ⟩ + suc x + ∎ where open ≡-Reasoning + + +-- open import Relation.Binary.PropositionalEquality + +-- postulate extensionality : { n : Level} → Relation.Binary.PropositionalEquality.Extensionality n n -- (Level.suc n) + +-- <-≡-iff : {A B : (a b : ℕ ) → Set } → {a b : ℕ } → (A a b → B a b ) → (B a b → A a b ) → A ≡ B +-- <-≡-iff {A} {B} ab ba = {!!} + + +00 : {x y : ℕ } → x < y → 0 < minus y x +minus>0 {zero} {suc _} (s≤s z≤n) = s≤s z≤n +minus>0 {suc x} {suc y} (s≤s lt) = minus>0 {x} {y} lt + +distr-minus-* : {x y z : ℕ } → (minus x y) * z ≡ minus (x * z) (y * z) +distr-minus-* {x} {zero} {z} = refl +distr-minus-* {x} {suc y} {z} with <-cmp x y +distr-minus-* {x} {suc y} {z} | tri< a ¬b ¬c = begin + minus x (suc y) * z + ≡⟨ cong (λ k → k * z ) (minus<=0 {x} {suc y} (x ¬a ¬b c = +m= {_} {_} {suc y * z} ( begin + minus x (suc y) * z + suc y * z + ≡⟨ sym (proj₂ *-distrib-+ z (minus x (suc y) ) _) ⟩ + ( minus x (suc y) + suc y ) * z + ≡⟨ cong (λ k → k * z) (minus+n {x} {suc y} (s≤s c)) ⟩ + x * z + ≡⟨ sym (minus+n {x * z} {suc y * z} (s≤s (lt c))) ⟩ + minus (x * z) (suc y * z) + suc y * z + ∎ ) where + open ≡-Reasoning + lt : {x y z : ℕ } → suc y ≤ x → z + y * z ≤ x * z + lt {x} {y} {z} le = *≤ le + +minus- : {x y z : ℕ } → suc x > z + y → minus (minus x y) z ≡ minus x (y + z) +minus- {x} {y} {z} gt = +m= {_} {_} {z} ( begin + minus (minus x y) z + z + ≡⟨ minus+n {_} {z} lemma ⟩ + minus x y + ≡⟨ +m= {_} {_} {y} ( begin + minus x y + y + ≡⟨ minus+n {_} {y} lemma1 ⟩ + x + ≡⟨ sym ( minus+n {_} {z + y} gt ) ⟩ + minus x (z + y) + (z + y) + ≡⟨ sym ( +-assoc (minus x (z + y)) _ _ ) ⟩ + minus x (z + y) + z + y + ∎ ) ⟩ + minus x (z + y) + z + ≡⟨ cong (λ k → minus x k + z ) (+-comm _ y ) ⟩ + minus x (y + z) + z + ∎ ) where + open ≡-Reasoning + lemma1 : suc x > y + lemma1 = x+y z + lemma = <-minus {_} {_} {y} ( subst ( λ x → z + y < suc x ) (sym (minus+n {x} {y} lemma1 )) gt ) + +minus-* : {M k n : ℕ } → n < k → minus k (suc n) * M ≡ minus (minus k n * M ) M +minus-* {zero} {k} {n} lt = begin + minus k (suc n) * zero + ≡⟨ *-comm (minus k (suc n)) zero ⟩ + zero * minus k (suc n) + ≡⟨⟩ + 0 * minus k n + ≡⟨ *-comm 0 (minus k n) ⟩ + minus (minus k n * 0 ) 0 + ∎ where + open ≡-Reasoning +minus-* {suc m} {k} {n} lt with <-cmp k 1 +minus-* {suc m} {.0} {zero} lt | tri< (s≤s z≤n) ¬b ¬c = refl +minus-* {suc m} {.0} {suc n} lt | tri< (s≤s z≤n) ¬b ¬c = refl +minus-* {suc zero} {.1} {zero} lt | tri≈ ¬a refl ¬c = refl +minus-* {suc (suc m)} {.1} {zero} lt | tri≈ ¬a refl ¬c = minus-* {suc m} {1} {zero} lt +minus-* {suc m} {.1} {suc n} (s≤s ()) | tri≈ ¬a refl ¬c +minus-* {suc m} {k} {n} lt | tri> ¬a ¬b c = begin + minus k (suc n) * M + ≡⟨ distr-minus-* {k} {suc n} {M} ⟩ + minus (k * M ) ((suc n) * M) + ≡⟨⟩ + minus (k * M ) (M + n * M ) + ≡⟨ cong (λ x → minus (k * M) x) (+-comm M _ ) ⟩ + minus (k * M ) ((n * M) + M ) + ≡⟨ sym ( minus- {k * M} {n * M} (lemma lt) ) ⟩ + minus (minus (k * M ) (n * M)) M + ≡⟨ cong (λ x → minus x M ) ( sym ( distr-minus-* {k} {n} )) ⟩ + minus (minus k n * M ) M + ∎ where + M = suc m + lemma : {n k m : ℕ } → n < k → suc (k * suc m) > suc m + n * suc m + lemma {zero} {suc k} {m} (s≤s lt) = s≤s (s≤s (subst (λ x → x ≤ m + k * suc m) (+-comm 0 _ ) x≤x+y )) + lemma {suc n} {suc k} {m} lt = begin + suc (suc m + suc n * suc m) + ≡⟨⟩ + suc ( suc (suc n) * suc m) + ≤⟨ ≤-plus-0 {_} {_} {1} (*≤ lt ) ⟩ + suc (suc k * suc m) + ∎ where open ≤-Reasoning + open ≡-Reasoning diff -r 000000000000 -r 9615a94b18ca nfa.agda --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nfa.agda Thu Nov 12 11:45:34 2020 +0900 @@ -0,0 +1,109 @@ +module nfa where +open import Level renaming ( suc to Suc ; zero to Zero ) + +open import Relation.Binary.PropositionalEquality +open import Data.List +open import automaton +open import logic + +record NAutomaton {n : Level} ( Q : Set n ) ( Σ : Set ) + : Set (Suc n) where + field + Nδ : Q → Σ → Q → Set + NF : Q → Set + Nexists : (Q → Set) → Set + +open NAutomaton + +naccept : {n : Level} {Q : Set n} {Σ : Set} → NAutomaton Q Σ → (Q → Set) → List Σ → Set +naccept {n} {Q} {Σ} nfa qs [] = Nexists nfa (λ q → qs q ∧ NF nfa q ) +naccept {n} {Q} {Σ} nfa qs (x ∷ input) = + Nexists nfa (λ q → qs q ∧ (naccept nfa (Nδ nfa q x) input )) + +ntrace : {n : Level} {Q : Set n} {Σ : Set } → (NFA : NAutomaton Q Σ) → (start : Q → Set ) → (input : List Σ ) → naccept NFA start input + → ((Q → Set) → List Q) + → List (List Q) +ntrace {n} {Q} {Σ} A q [] a list = list q ∷ [] +ntrace {n} {Q} {Σ} A q (x ∷ t) a list = list q ∷ ( ntrace A {!!} t {!!} list ) + +data transition136 : Q3 → Σ2 → Q3 → Set where + d0 : transition136 q₁ s1 q₂ + d1 : transition136 q₁ s0 q₁ + d2 : transition136 q₂ s0 q₂ + d3 : transition136 q₂ s0 q₃ + d4 : transition136 q₂ s1 q₃ + d5 : transition136 q₃ s0 q₁ + +start136 : Q3 → Set +start136 q = q ≡ q₁ + +nfa136 : NAutomaton Q3 Σ2 +nfa136 = record { Nδ = transition136 ; NF = λ q → q ≡ q₁ ; Nexists = exists-in-Q3 } + +example136-1 = naccept nfa136 start136 ( s0 ∷ s1 ∷ s0 ∷ s0 ∷ [] ) + +example136-0 = naccept nfa136 start136 ( s0 ∷ [] ) + +example136-2 = naccept nfa136 start136 ( s1 ∷ s0 ∷ s1 ∷ s0 ∷ s1 ∷ [] ) + +-- +-- ((Q → Set) → Set) → ((Q → Set) → Set) → Set +-- + +data Nexists→exits {n : Level} { Q : Set n } {Σ : Set} ( NFA : NAutomaton Q Σ ) : ((Q → Set) → Set) → Set where + one-of : Nexists→exits NFA (Nexists NFA) + +subset-construction : {n : Level} { Q : Set n } { Σ : Set } → + (NAutomaton Q Σ ) → Automaton {Suc Zero ⊔ n} (Q → Set) Σ +subset-construction {n} {Q} { Σ} NFA = record { + δ = λ qs x qs → Nexists NFA (λ q → Nδ NFA q x qs ) + ; F = λ qs → Nexists NFA ( λ q → NF NFA q ) + ; exists = Nexists→exits NFA -- what this means? + } + +subset-construction-lemma→ : { Q : Set } { Σ : Set } → + (NFA : NAutomaton Q Σ ) → (astart : Q → Set ) + → (x : List Σ) + → naccept NFA ( λ q1 → astart q1) x + → accept ( subset-construction NFA ) ( λ q1 → astart q1) x +subset-construction-lemma→ = {!!} + +subset-construction-lemma← : { Q : Set } { Σ : Set } → + (NFA : NAutomaton Q Σ ) → (astart : Q → Set ) + → (x : List Σ) + → accept ( subset-construction NFA ) ( λ q1 → astart q1) x + → naccept NFA ( λ q1 → astart q1) x +subset-construction-lemma← = {!!} + +open import regular-language + +open RegularLanguage +open Automaton +open import Data.Empty + +Concat-exists : {n : Level} {Σ : Set} → (A B : RegularLanguage {n} Σ ) → (states A ∨ states B → Set) → Set +Concat-exists {n} {Σ} A B P = exists (automaton A) (λ q → P (case1 q)) ∨ exists (automaton B) (λ q → P (case2 q)) + +Concat-NFA : {n : Level} {Σ : Set} → (A B : RegularLanguage {n} Σ ) → NAutomaton (states A ∨ states B) Σ +Concat-NFA {n} {Σ} A B = record { Nδ = δnfa ; NF = nend ; Nexists = Concat-exists A B } + module Concat-NFA where + data δnfa : states A ∨ states B → Σ → states A ∨ states B → Set where + a-case : {q : states A} {i : Σ } → δnfa ( case1 q) i (case1 (δ (automaton A) q i)) + ab-trans : {q : states A} {i : Σ } → F (automaton A) q → δnfa ( case1 q) i (case2 (δ (automaton B) (astart B) i)) + b-case : {q : states B} {i : Σ } → δnfa ( case2 q) i (case2 (δ (automaton B) q i)) + nend : states A ∨ states B → Set + nend (case2 q) = F (automaton B) q + nend (case1 q) = F (automaton A) q ∧ F (automaton B) (astart B) -- empty B case + +data state-is {n : Level} {Σ : Set } (A : RegularLanguage {n} Σ ) : (a : states A ) → Set where + this : (a : states A) → state-is A a + +closed-in-concat : {n : Level} {Σ : Set } → (A B : RegularLanguage {n} Σ ) → ( x : List Σ ) + → isRegular (Concat {n} (contain A) (contain B)) x record {states = states A ∨ states B → Set ; astart = λ q → state-is A (astart A) + ; automaton = subset-construction ( Concat-NFA A B )} +closed-in-concat {Σ} A B x = {!!} + + + + + diff -r 000000000000 -r 9615a94b18ca regular-language.agda --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/regular-language.agda Thu Nov 12 11:45:34 2020 +0900 @@ -0,0 +1,97 @@ +{-# OPTIONS --allow-unsolved-metas #-} +module regular-language where + +open import Level renaming ( suc to Suc ; zero to Zero ) +open import Data.List +-- 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 (Suc Zero) +isRegular A x r = A x ≡ contain r x + +-- +-- (states A × states B → Set) → ( states A → Set ) → ( states B → Set ) → Set +-- +exists-Union : {n : Level} {Σ : Set} → (A B : RegularLanguage {n} Σ ) → (states A × states B → Set) → Set +exists-Union A B Pab = exists (automaton A) (λ qa → exists (automaton B) (λ qb → Pab (qa , qb)) ) + +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) ) + ; exists = exists-Union A B + } + } + +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 = refl +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 = refl + 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 = {!!} +