благодаря людям на этом замечательном сайте мне удалось собрать почти полный и работающий код. У меня есть последний вопрос.
вот код:
(define (chartest ch)
(lambda (x) (char=? x ch)))
(define fsm-trans
'((A (lambda (x) (string=? x "a") B), (B (lambda (x) (string=? x "a") C)))))
(define (find-next-state state ch trl)
(cond
[(empty? trl) false]
[(and (symbol=? state (first (first trl)))
((second (first trl)) ch))
(third (first trl))]
[else (find-next-state state ch (rest trl))]))
(define fsm-final '(C))
(define start-state 'A)
(define (run-fsm start trl final input)
(cond
[(empty? input)
(cond
[(member start final) true]
[else false])]
[else
(local ((define next (find-next-state start (first input) trl)))
(cond
[(boolean? next) false]
[else (run-fsm next trl final (rest input))]))]))
(run-fsm start-state fsm-trans fsm-final (string->list "ac"))
У меня проблема с функцией перехода find-next-state. Как я могу определить его, чтобы проверить входящие символы и на основании этого либо вернуть истинное значение, когда fsm достигает конечного состояния, либо ложное значение, если этого не происходит?
Спасибо за ваш ответ.
UPDATE:
Спасибо за ваш ответ, и мне жаль, что код вводит в заблуждение.
Я восстановил определение трансформаций, которое теперь выглядит так:
(define fsm-trans
'((A (lambda (x) (string=? x "a") B)
(B (lambda (x) (string=? x "a") C)))))
Но сейчас я пытаюсь определить функцию перехода. Когда у меня не было фиксированного переходного символа, и я использовал char-alphabetic? и символьно-числовые ?, эти строки кода работали как шарм:
(define (find-next-state state ch trl)
(cond
[(empty? trl) false]
[(and (symbol=? state (first (first trl)))
((second (first trl)) ch))
(third (first trl))]
[else (find-next-state state ch (rest trl))]))
Но что я должен изменить, чтобы работать с новым определением состояний в fsm-trans?
Когда этот код вводится в DrScheme, он показывает ошибку со строкой: ((second (first trl)) ch)).
Спасибо за вашу дальнейшую помощь!