0

教科書「Teaching Nondeterministic and Universal Automata using Scheme」のコードをテストしようとしています。DrRacket を R5RS として設定しました。

コードの定義部分をコピーしましたが、まだ問題が発生しています

未定義の識別子への参照: read-only-tape

関連するコードは次のとおりです。

(define tape
  (lambda()
    (let((blank '$))
      (let ((left-part(list blank))
            (right-part(list blank)))
        (lambda message
          (case(car message)
            ((init!)
             (set! left-part(reverse(caadr message)))
             (set! right-part(cadadr message)))
            ((write!)
             (if(equal? right-part(list blank))
                (set! right-part (cons(cadr message) right-part))
                (set! right-part (cons(cadr message)(cdr right-part)))))
            ((left!)
             (set! right-part (cons (car left-part) right-part))
             (if(not(equal? left-part (list blank)))
                (set! left-part(cdr left-part))))
            ((right!)
             (set! left-part (cons (car right-part) left-part))
             (if (not (equal? right-part (list blank)))
                 (set! right-part (cdr right-part))))
            ((show)
             (list (reverse left-part) right-part))
            ((read)
             (car right-part))
            (else (error 'rape "Message ~a cannot be evaluated" (car message)))))))))

(define read-only-tape
  (lambda()
    (let ((tape-obj (tape)))
      (lambda message
        (case(car message)
          ((reconfig!)(tape-obj 'right))
          ((left! right! write!)
           (error 'message "~a is prohibited for read-only-tapes" (car message)))
          (else(apply tape-obj message)))))))

ここでは読み取り専用テープを使用しています。

(define automaton
  (lambda(start)
        (eval
         '(letrec
           ((q0(lambda(tape)
                 (printf "~a~n~a~n" (contents tape) 'q0)
                 (case (at tape)
                   ((a)(reconfig! tape)(q2 tape))
                   ((b)(reconfig! tape)(q1 tape))
                   (else #f))))
            (q1(lambda(tape)
                 (printf "~a~n~a~n" (contents tape) 'q1)
                 (case (at tape)
                   ((a)(reconfig! tape)(q5 tape))
                   ((b)(reconfig! tape)(q5 tape))
                   (($) #t)
                   (else #f))))
            (q2(lambda(tape)
                 (printf "~a~n~a~n" (contents tape) 'q2)
                 (case (at tape)
                   ((a)(reconfig! tape)(q3 tape))
                   ((b)(reconfig! tape)(q6 tape))
                   (else #f))))
            (q3(lambda(tape)
                 (printf "~a~n~a~n" (contents tape) 'q3)
                 (case (at tape)
                   ((a)(reconfig! tape)(q3 tape))
                   ((b)(reconfig! tape)(q4 tape))
                   (else #f))))
            (q4(lambda(tape)
                 (printf "~a~n~a~n" (contents tape) 'q4)
                 (case (at tape)
                   ((a)(reconfig! tape)(q5 tape))
                   ((b)(reconfig! tape)(q5 tape))
                   (($) #t)
                   (else #f))))
            (q5(lambda(tape)
                 (printf "~a~n~a~n" (contents tape) 'q5)
                 (case (at tape)
                   ((a)(reconfig! tape)(q5 tape))
                   ((b)(reconfig! tape)(q5 tape))
                   (else #f))))
            (q6(lambda(tape)
                 (printf "~a~n~a~n" (contents tape) 'q6)
                 (case (at tape)
                   ((a)(reconfig! tape)(q5 tape))
                   ((b)(reconfig! tape)(q6 tape))
                   (($) #t)
                   (else #f)))))
           (let((t (read-only-tape)))
             (lambda(input)
               (init! t input)
               (eval (list ,start t)
                     (null-environment 5)))))
         (null-environment 5))))

私はそれを実行します

(run automaton 'q0 '(($)(a a b $)))

教科書の例です。定義コードを無視していますか?

4

1 に答える 1

1

プログラムの最後の数行では、 の環境evalを benull-environmentに指定しています。これにより、以前に定義したすべてが除外されます。その部分をそのままにしておくとeval、現在のトップレベルの環境が使用されます。これが必要です。

また、 に構文エラーがあります(list ,start t)。という意味だったと思います(list start #t)編集:または、 .`(letrecではautomatonなく'(letrec.

于 2012-03-31T20:21:40.493 に答える