drscheme - конечный автомат - PullRequest
1 голос
/ 08 июня 2011

благодаря людям на этом замечательном сайте мне удалось собрать почти полный и работающий код. У меня есть последний вопрос.

вот код:

     (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)).

Спасибо за вашу дальнейшую помощь!

1 Ответ

5 голосов
/ 08 июня 2011

Похоже, что основная проблема в этом коде - это путаница в кавычках, квазицитатах и ​​кавычках.В частности, '(foo (lambda (x) x) baz) цитирует вещь целом , поэтому там нет функции, только символическое представление для нее.Кроме того, использование , выглядит так, будто вы путаете его с чем-то, что разделяет значения в списке.Другая проблема заключается в том, что парены выглядят несоответствующими.Вы, вероятно, хотите что-то вроде этого вместо этого, используя квазицитату:

(define fsm-trans
  `((A ,(lambda (x) (string=? x "a") B))
    (B ,(lambda (x) (string=? x "a") C))))

Но , учитывая, что вы не знаете об этих вещах, тогда это будет много лучше придерживаться только простых кавычек и использовать list при необходимости:

(define fsm-trans
  (list (list 'A (lambda (x) (string=? x "a") B))
        (list 'B (lambda (x) (string=? x "a") C))))

У вас, вероятно, есть еще несколько проблем, чтобы преодолеть их, но выполнение этого должно привести вас в правильном направлении.

...