この素晴らしいサイトの人々のおかげで、ほぼ完全で機能するコードをまとめることができました。最後に 1 つ質問があります。
コードは次のとおりです。
(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 が最終状態に達したときに true 値を返すか、そうでないときに false 値を返すように定義するにはどうすればよいですか?
ご回答ありがとうございます。
アップデート:
ご回答ありがとうございます。コードがわかりにくくて申し訳ありません。トランジションの定義を修正したところ、次のようになりました。
(define fsm-trans
'((A (lambda (x) (string=? x "a") B)
(B (lambda (x) (string=? x "a") C)))))
しかし今、遷移関数を定義しようとしています。固定遷移文字がなく、char-alphabetic を使用したときは? と char-numeric?、これらのコード行は魔法のように機能しました:
(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)) という行のエラーが表示されます。
今後ともよろしくお願いいたします。