我正试图在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))))
编辑:
OK ..整体产品okey,但是我的导师不满意它,..他希望我创建一个带有转换函数的有限状态机 - >类似于全局定义,它会说:当状态X中字符Y转到Z时那么我会测试一个字符列表,看看它是错误还是真实的......所以唯一的区别是代码不应该只使用数字和字母,而是使用任何字符...是不是有可能?谢谢您的回答
编辑2:现在我有基本的信息应该如何看起来像:
也就是说,整机看起来像
一个---------> B ----------> C ----------> D ---------->(E) 字母数字编号字母
(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?
实施例:
START ---- “B” ----->状态A ----- “一个” ---->状态B ----- “C” - ----> FINAL STATE
只有当字符列表是“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 2011-05-25 19:36:48
@Heatsink:我将代码导入dr-scheme,并使用制表键 – ccoakley 2011-05-26 04:06:23
与Emacs进行了紧密合作。在Emacs中,您可以刚刚完成C-A- \。只是在说'。 – JasonFruit 2011-05-30 11:37:11