gpt4 book ai didi

scheme - Scheme 中的有限状态机

转载 作者:行者123 更新时间:2023-12-04 03:11:50 28 4
gpt4 key购买 nike

我正在尝试在 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 comes character Y go to 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?

谢谢您的回答!!!

最佳答案

我很好奇:我想你没有写这个fsm?这是家庭作业还是你想自学? FSM 的代码看起来不错(实际上非​​常好)。但是,您的发布行:

(fsmtrlst (list 'start (lambda (abc112) (char=? abc112 ))))

没有意义。原因如下:fsmtrlst 是有限状态机转换列表。它是在第一个大代码块中定义的。它不是要调用的函数。我相信您要调用的函数是 run-fsm。这需要一个开始符号、一个转换列表、一个最终状态列表和一个输入。输入实际上不是字符串,而是列表。因此,您可以使用以下行启动它:

(run-fsm 'start fsmtrlst fsmfinal (string->list "abc112"))

这将使用定义的转换列表 fsmtrlst、定义的最终状态列表和字符串“abc112”的输入就绪形式调用 run-fsm

顺便说一下,除了'start 之外的所有内容都被定义为最终(接受)状态。但是,并非所有输入都接受输入。例如,接受用“abc(122”替换“abc122”。

这是你想要的吗?

更新:

您的编辑澄清了一些事情。您对 fsmstart 的定义很好。您确实在 fsmtrlst 中的一个 char-alphabetic? 用法中遗漏了一个问号 (?)。您是否因为不知道如何使用新定义而感到困惑?首先,您应该删除 fsmtrlstfsmfinal 的旧定义。否则,您可能会遇到重复定义错误。根据您的新定义,您要执行的行应如下所示:

(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) (string=? x "a") B)

当您尝试调用您的函数时,您采用了一个需要字符列表的函数,并为它提供了一个字符串列表列表。这些不是一回事。此外,您是否注意到您在列表中放置了逗号,但它们在代码的其他地方不存在?这些错误是我建议您开始学习方案教程的原因。这些是基本方案问题,与您的特定练习无关。我建议您将编辑内容倒回到昨天的内容。

很遗憾,我无法再更新此答案。我想更新我的答案,这样如果有人带着类似的顾虑提出你的问题,他们就会看到完整的答案。但是,您提供了一个移动目标。请考虑停止编辑,并在有问题时提交新问题。

关于scheme - Scheme 中的有限状态机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6129761/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com