Scheme 格式中的有限状态机

Scheme 格式中的有限状态机,scheme,racket,Scheme,Racket,我试图在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-alphabet

我试图在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:现在我有了它应该是什么样子的基本信息:

(run-fsm fsmstart fsmtrlst fsmfinal (string->list "w00t"))
也就是说,机器看起来像

A------>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会有什么不同

例如:

开始---“b”-->状态A---“A”-->状态b---“c”-->最终状态

只有当字符列表为“bac”且没有其他字符时,fsm才会成立。 可能吗

谢谢你的反馈

编辑4:

好的,我设法写了,但再一次,我不知道如何输入字符。代码如下:

#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))]))]))
有三种状态,但只有当从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?
(定义(图表测试)
(λ(x)(字符=?x ch)))
(定义fsm trans
((A,“A”,B),(A,“B”,A),(B,“c”,c)))
(定义(查找下一个状态ch trl)
(续)
[(空?trl)假]
[(和(符号=?状态(第一个(第一个trl)))

((第二次(第一次trl))ch))我很好奇:我想你没有写这个fsm?这是家庭作业还是你在自学?fsm的代码看起来很好(事实上很好)。但是,你的发布路线:

(fsmtrlst (list 'start (lambda (abc112) (char=? abc112 ))))
没有意义。原因如下:
fsmtrlst
是有限状态机转换列表。它是在第一大块代码中定义的。它不是要调用的函数。我相信您要调用的函数是
run fsm
。它包含开始符号、转换列表、最终状态列表和输入。输入不是ac实际上是一个字符串,但却是一个列表。因此,您可以使用以下行启动它:

(run-fsm 'start fsmtrlst fsmfinal (string->list "abc112"))
这将调用
运行fsm
,并使用定义的转换列表
fsmtrlst
、定义的最终状态列表和字符串“abc112”的输入就绪形式

顺便说一句,除了“开始”
之外的所有内容都定义为最终(接受)状态。但并非所有输入都接受输入。例如,不接受将“abc122”替换为“abc(122)”

这是你想要的吗

更新:

您的编辑澄清了问题。您对
fsmstart
的定义很好。您确实漏掉了一个问号(?)关于
fsmtrlst
中的
char-alphastic?
用法之一。您是否感到困惑,不知道如何使用新定义?首先,您应该删除
fsmtrlst
fsmfinal
的旧定义。否则,您可能会得到重复的定义错误。从新定义中,您的行到ecute应该是这样的:

(run-fsm fsmstart fsmtrlst fsmfinal (string->list "w00t"))
这将返回#t,因为“w00t”是一个字符,后跟两个数字和一个字符

我推测您仍然难以理解scheme的语法规则,而不仅仅是特定程序的逻辑问题。您可能想尝试一个更简单的练习

更新2:你不应该考虑制定一个新的问题吗? 您最近的更新已破坏代码。fsm的转换部分工作正常,因为转换被定义为列表:

(from-state test-function to-state)
您已尝试创建转换:

(from-state string-literal to-state)
您可以将
(A,“A”,B)
更改为
(A(lambda(x)(字符串=?x“A”)B)

当你试图调用你的函数时,你得到了一个需要字符列表的函数,并给了它一个字符串列表。这不是一回事。另外,你有没有注意到你在列表中放了逗号,但它们在代码中不存在?这些错误就是我建议你开始scheme教程的原因。这些是基本的Schemae问题,与您的特定练习无关。我建议您将编辑内容倒回昨天的内容


遗憾的是,我不能再更新这个答案了。我想更新我的答案,如果有人带着类似的问题来回答你的问题,他们会看到一个完整的答案。然而,你已经提供了一个移动的目标。请考虑停止你的编辑并在你有一个问题时提交一个新的问题。可读。另外,有限状态机应该做什么?@Headsink:我将代码导入dr scheme并在Emacs中使用tab键发疯了,你本可以做C-A-\。只是说。我已经更新了我的答案,但我担心你会被一些小问题所困扰,这些小问题可以通过尝试一个更简单的练习得到更好的解决。你在使用scheme吗我已经编辑了(好几次)我的问题。在完成fsm之前,我面临着最后的问题。