【发布时间】:2011-05-25 19:27:54
【问题描述】:
我正在尝试在 Scheme 中完成一个有限状态机。问题是,我不确定如何告诉它应该测试哪些字符。如果我想测试一个字符串 "abc112" 那我该怎么做呢?
代码如下:
#lang racket
(define (chartest ch)
(lambda (x) (char=? x ch)))
;; A transition is (list state char!boolean state)
(define fsmtrlst
(list
(list 'start char-alphabetic? 'name)
(list 'start char-numeric? 'number)
(list 'start (chartest #\() 'lparen)
(list 'start (chartest #\)) 'rparen)
(list 'name char-alphabetic? 'name)
(list 'name char-numeric? 'name)
(list 'number char-numeric? 'number)))
(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 fsmfinal '(name number lparen rparen))
(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))]))]))
这是我要测试的启动代码:
(fsmtrlst (list 'start (lambda (abc112) (char=? abc112 ))))
编辑:
好的,.. 整体产品还可以,但我的导师对此并不满意,.. 他希望我制作一个具有转换功能的有限状态机 -> 类似于全局定义,它会说:当处于状态时X 来字符 Y 去 Z ...然后我将测试一个字符列表,看看它是假还是真...所以唯一的区别是代码不应该只使用数字和字母,而是任何角色...有可能吗?谢谢你的回答
编辑 2:现在我有了基本信息:
也就是机器的样子
A ---------> B ----------> C ----------> D ----------> (五) 字母数字数字字母
(define fsmtrlst
(list
(list 'A char-alphabetic? 'B)
(list 'B char-numeric? 'C)
(list 'C char-numeric? 'D)
(list 'D char-alphabetic 'E)))
(define fsmfinal '(E))
(define fsmstart 'A)
但我不确定如何编写 fsmstart 的定义。
感谢您的回答。
这接受正好四个字符的序列,即字母、数字、数字、字母,仅此而已。
编辑 3:我正在使用在线教程和我的导师老师提供的一本书。我想出了我想做的fsm。感谢您的帮助。
只是出于好奇:
拥有相当具体的 fsm 会有什么不同?
例子:
开始 ----"b"-----> 状态 A -----"a" ----> 状态 B -----"c"-----> 最终状态
只有当字符列表是“bac”而不是其他时,fsm 才会为真。 有可能吗?
感谢您的反馈。
编辑 4:
好的,我设法写了,但我又不知道如何输入字符。这是代码:
有 3 种状态,但只有从状态 A 到状态 C 时才会成立。
(define (chartest ch)
(lambda (x) (char=? x ch)))
(define fsm-trans
'((A, "a", B), (A, "b", A), (B, "c", C)))
(define (find-next-state state ch trl)
(cond
[(empty? trl) false]
[(and (symbol=? state (first (first trl)))
((second (first trl)) ch)) <- And also this line returns an error
(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 (list '("a", "c"))) <- I know this is the last problem with the code, the definition of the input. How can I tell Scheme what characters I want to test?
谢谢你的回答!!!
【问题讨论】:
-
请缩进您的代码以使其可读。还有,有限状态机应该做什么?
-
@Heatsink:我将代码导入 dr-scheme 并使用 Tab 键发疯了
-
在 Emacs 中,你可以只做 C-A-\。只是说。
-
我已经更新了我的答案,但我担心你会被一些小问题困扰,而这些小问题可以通过尝试更简单的练习来更好地解决。您是否正在使用计划教程或书籍来配合您的辅导?