我正試圖在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