计划中的DFA(作业)

时间:2018-11-11 00:40:21

标签: scheme racket dfa

处理一个作业问题,要求在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)

1 个答案:

答案 0 :(得分:1)

请勿为此使用EVAL。

P,Q0,Q1,Q2的定义看起来不错。

如果我们可以直接定义DFA,则只需删除DFA-trans。

假设Q0是开始状态,我想您可以简单地做到这一点

(define DFA (lambda () (Q0 x)))

并考虑使用COND而不是嵌套的IF。