module DFA where
record _×_ (A B : Set) : Set where
constructor _,_
field
fst : A
snd : B
infixr 5 _∷_
data List (a : Set) : Set where
[] : List a
_∷_ : a → List a → List a
data _∈_ {A : Set}(x : A) : (xs : List A) → Set where
here : ∀ {xs} → x ∈ (x ∷ xs)
there : ∀ {y xs} → x ∈ xs → x ∈ (y ∷ xs)
data _≡_ {A : Set}(x : A) : A → Set where
refl : x ≡ x
data ⊥ : Set where
¬_ : Set → Set
¬ A = A → ⊥
record DFA (Q : Set) (Σ : Set) (q₀ : Q) (δ : Q × Σ → Q) (F : List Q) : Set where
data DFArun {Q Σ q₀ δ F}(dfa : DFA Q Σ q₀ δ F) : (q : Q) → (w : List Σ) → Set where
empty : {q : Q} → q ∈ F → DFArun dfa q []
acceptOne : {ws : List Σ} →
(w : Σ) →
(q : Q) →
DFArun dfa (δ (q , w)) ws →
DFArun dfa q (w ∷ ws)
data Accepts {Q Σ q₀ δ F}(dfa : DFA Q Σ q₀ δ F) : (w : List Σ) → Set where
accepts : ∀{w} → DFArun dfa q₀ w → Accepts dfa w
data CantAccept {Q Σ q₀ δ F}(dfa : DFA Q Σ q₀ δ F) : (q : Q) → (w : List Σ) → Set where
cantAccept : ∀ {w q} → DFArun dfa q w → ¬(q ≡ q₀) → CantAccept dfa q w
data _∈Lang_ {Q Σ q₀ δ F}(w : List Σ)(dfa : DFA Q Σ q₀ δ F) : Set where
inLang : Accepts dfa w → w ∈Lang dfa
notInLang : ∀{q} → CantAccept dfa q w → w ∈Lang dfa
data TestQ : Set where
evenNumberOfAs : TestQ
oddNumberOfAs : TestQ
data TestΣ : Set where
a : TestΣ
b : TestΣ
Testδ : TestQ × TestΣ → TestQ
Testδ (evenNumberOfAs , a) = oddNumberOfAs
Testδ (evenNumberOfAs , b) = evenNumberOfAs
Testδ (oddNumberOfAs , a) = evenNumberOfAs
Testδ (oddNumberOfAs , b) = oddNumberOfAs
TestF : List TestQ
TestF = evenNumberOfAs ∷ []
TestDFA : DFA TestQ TestΣ evenNumberOfAs Testδ TestF
TestDFA = _
input₁ input₂ input₃ : List TestΣ
input₁ = []
input₂ = a ∷ b ∷ a ∷ a ∷ b ∷ []
input₃ = b ∷ b ∷ a ∷ b ∷ a ∷ []
proof₁ : input₁ ∈Lang TestDFA
proof₁ = inLang (accepts (empty here))
proof₂ : input₂ ∈Lang TestDFA
proof₂ = notInLang
(cantAccept
(acceptOne a oddNumberOfAs
(acceptOne b evenNumberOfAs
(acceptOne a evenNumberOfAs
(acceptOne a oddNumberOfAs
(acceptOne b evenNumberOfAs (empty here))))))
(λ ()))
proof₃ : input₃ ∈Lang TestDFA
proof₃ = inLang
(accepts
(acceptOne b evenNumberOfAs
(acceptOne b evenNumberOfAs
(acceptOne a evenNumberOfAs
(acceptOne b oddNumberOfAs
(acceptOne a oddNumberOfAs (empty here)))))))