comparison automaton-in-agda/src/regex.agda @ 411:207e6c4e155c

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Wed, 29 Nov 2023 17:40:55 +0900
parents af8f630b7e60
children
comparison
equal deleted inserted replaced
410:db02b6938e04 411:207e6c4e155c
12 open import Relation.Binary.PropositionalEquality as RBF hiding ( [_] ) 12 open import Relation.Binary.PropositionalEquality as RBF hiding ( [_] )
13 open import Relation.Nullary using (¬_; Dec; yes; no) 13 open import Relation.Nullary using (¬_; Dec; yes; no)
14 open import logic 14 open import logic
15 open import regular-language 15 open import regular-language
16 16
17 -- (abc|d.*)
18 -- any = < a > || < b > || < c > || < d >
19 -- ( < a > & < b > & < c > ) || ( <d > & ( any * ) )
20
17 data Regex ( Σ : Set) : Set where 21 data Regex ( Σ : Set) : Set where
18 ε : Regex Σ -- empty 22 ε : Regex Σ -- empty
19 φ : Regex Σ -- fail 23 φ : Regex Σ -- fail
20 _* : Regex Σ → Regex Σ 24 _* : Regex Σ → Regex Σ
21 _&_ : Regex Σ → Regex Σ → Regex Σ 25 _&_ : Regex Σ → Regex Σ → Regex Σ
22 _||_ : Regex Σ → Regex Σ → Regex Σ 26 _||_ : Regex Σ → Regex Σ → Regex Σ
23 <_> : Σ → Regex Σ 27 <_> : Σ → Regex Σ
24 28
25 infixr 40 _&_ _||_ 29 infixr 40 _&_ _||_
26 30
27 -- Meaning of regular expression 31 -- Meaning of regular expression
28 32
29 regex-language : {Σ : Set} → Regex Σ → ((x y : Σ ) → Dec (x ≡ y)) → List Σ → Bool 33 regex-language : {Σ : Set} → Regex Σ → ((x y : Σ ) → Dec (x ≡ y)) → List Σ → Bool
30 regex-language φ cmp _ = false 34 regex-language φ cmp _ = false
31 regex-language ε cmp [] = true 35 regex-language ε cmp [] = true
32 regex-language ε cmp (_ ∷ _) = false 36 regex-language ε cmp (_ ∷ _) = false
33 regex-language (x *) cmp = repeat ( regex-language x cmp ) 37 regex-language (x *) cmp = repeat ( regex-language x cmp ) []
34 regex-language (x & y) cmp = split ( λ z → regex-language x cmp z ) (λ z → regex-language y cmp z ) 38 regex-language (x & y) cmp = split ( λ z → regex-language x cmp z ) (regex-language y cmp )
35 regex-language (x || y) cmp = λ s → ( regex-language x cmp s ) \/ ( regex-language y cmp s) 39 regex-language (x || y) cmp = λ s → ( regex-language x cmp s ) \/ ( regex-language y cmp s)
36 regex-language < h > cmp [] = false 40 regex-language < h > cmp [] = false
37 regex-language < h > cmp (h1 ∷ [] ) with cmp h h1 41 regex-language < h > cmp (h1 ∷ [] ) with cmp h h1
38 ... | yes _ = true 42 ... | yes _ = true
39 ... | no _ = false 43 ... | no _ = false
40 regex-language < h > _ (_ ∷ _ ∷ _) = false 44 regex-language < h > _ (_ ∷ _ ∷ _) = false