47 lines
1.3 KiB
Plaintext
47 lines
1.3 KiB
Plaintext
(import "sets.slime")
|
|
(import "automata.slime")
|
|
|
|
;; (make-delta
|
|
;; ("q0" :: "M" -> "q1")
|
|
;; ("q1" :: "A" -> "q0"
|
|
;; "G" -> "q1")
|
|
;; ("q2" :: "E" -> "q0"))
|
|
|
|
(define (delta q s)
|
|
(cond (s (case q
|
|
(("q0") (case s (("M") "q1")))
|
|
(("q1") (case s (("A") "q0")
|
|
(("G") "q2")))
|
|
(("q2") (case s (("E") "q0")))))
|
|
(else q)))
|
|
|
|
(define aut (automata::make-dfa (set::make "q0" "q1" "q2")
|
|
(set::make "M" "A" "G" "E")
|
|
delta
|
|
"q0"
|
|
(set::make "q0")))
|
|
|
|
(let ((state (aut ())))
|
|
(assert (= (car state) :accept))
|
|
(assert (= (car (cdr state)) "q0")))
|
|
|
|
(let ((state (aut "M")))
|
|
(assert (= (car state) :fail))
|
|
(assert (= (car (cdr state)) "q1")))
|
|
|
|
(let ((state (aut "A")))
|
|
(assert (= (car state) :accept))
|
|
(assert (= (car (cdr state)) "q0")))
|
|
|
|
(let ((state (aut "M")))
|
|
(assert (= (car state) :fail))
|
|
(assert (= (car (cdr state)) "q1")))
|
|
|
|
(let ((state (aut "G")))
|
|
(assert (= (car state) :fail))
|
|
(assert (= (car (cdr state)) "q2")))
|
|
|
|
(let ((state (aut "E")))
|
|
(assert (= (car state) :accept))
|
|
(assert (= (car (cdr state)) "q0")))
|