1

この素晴らしいサイトの人々のおかげで、ほぼ完全で機能するコードをまとめることができました。最後に 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)) という行のエラーが表示されます。

今後ともよろしくお願いいたします。

4

1 に答える 1

5

このコードの主な問題は、引用符、準引用符、および引用符なしの混乱であるように見えます。具体的には、全体'(foo (lambda (x) x) baz)を引用しているので、そこには関数はなく、1つの記号表現だけです。また、の使用は、リスト内の値を区切るものとして混乱しているように見えます。もう1つの問題は、親が不一致に見えることです。代わりに、準引用符を使用して、このようなものが必要になる可能性があります。,

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

あなたはおそらく乗り越えるためにいくつかのより多くの問題を抱えています、しかしそれをすることはあなたを正しい方向に導くはずです。

于 2011-06-08T15:27:47.043 に答える