处理一个作业问题,要求在Scheme中编写DFA接受器。字母:{0,1}起始状态:{Q0}最终状态:{Q2}。字符串必须在序列中具有01才能被接受。 状态: 1上的Q0转换为Q1。 0上的Q0转换为Q0。 1上的Q1转换为Q2。 Q1在0上转换为P。 Q2在0和1上转换为Q1。 老师要求每个状态都是一个函数,并返回其过渡到的一个函数。 (Q0 1)返回Q1,依此类推。下面的代码是在确保检查字符串是否为01之前尝试使事物运行的尝试。当前收到错误:“ Q0:未绑定标识符;”并且不确定为什么进行了一些搜索之后。任何指针都会有所帮助。问题是家庭作业,所以不要寻找直接的答案。谢谢!
#lang racket
(define DFA-trans '((Q0 x) (Q1 x) '((Q2 x)) (P x)))
(define x '(1 1 0 1 0))
(define P(null? 1))
(define Q2 (lambda(x)
(if (null? (car x))
#t
(if (equal? (car x) 0)
(Q2 (cdr x))
(if (equal? (car x) 1)
(Q2 (cdr x))
#t
)))))
(define Q1 (lambda(x)
(if (null? (car x))
#f
(if (equal? (car x) 0)
(P (cdr x))
(if (equal? (car x) 1)
(Q2 (cdr x))
#f
)))))
(define Q0 (lambda(x)
(if (null? (car x))
#f
(if (equal? (car x) 0)
(Q0 (cdr x))
(if (equal? (car x) 1)
(Q1 (cdr x))
#f
)))))
(define DFA(map eval DFA-trans))
(DFA)
答案 0 :(得分:1)
请勿为此使用EVAL。
P,Q0,Q1,Q2的定义看起来不错。
如果我们可以直接定义DFA,则只需删除DFA-trans。
假设Q0是开始状态,我想您可以简单地做到这一点
(define DFA (lambda () (Q0 x)))
并考虑使用COND而不是嵌套的IF。