DFA in Scheme(家庭作业)

问题描述 投票:1回答:1

在家庭作业问题上工作,要求在Scheme中写一个DFA接受者。字母:{0,1}开始状态:{Q0}最终状态:{Q2}。字符串必须在序列中具有01才能被接受。状态:Q0 on 1过渡到Q1。 Q0 on 0转换为Q0。 Q1 on 1过渡到Q2。 Q1 on 0转换为P. Q2 on 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)
scheme racket dfa
1个回答
1
投票

不要为此使用EVAL。

P,Q0,Q1,Q2的定义看起来很好。

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

假设Q0是开始状态,我认为你可以简单地这样做

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

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

© www.soinside.com 2019 - 2024. All rights reserved.