方案中的有限状态机

如何解决方案中的有限状态机

| 我正在尝试在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 ---------->(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才为true,而没有别的。 可能吗? 感谢您的反馈意见。 编辑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
。 顺便提及,除“ 10”以外的所有东西都被定义为最终(接受)状态。但是,并非所有输入都接受输入。例如,不接受将\“ abc122 \”替换为\“ abc(122 \”)。 这是你想要的吗? 更新: 您的修改已使事情变得清晰。您对
fsmstart
的定义很好。您确实在
fsmtrlst
中的
char-alphabetic?
用法中错过了一个问号(?)。您是否因为不知道如何使用新定义而感到困惑?首先,您应删除ѭ5和ѭ15的旧定义。否则,您可能会收到重复的定义错误。根据您的新定义,您要执行的行应如下所示:
(run-fsm fsmstart fsmtrlst fsmfinal (string->list \"w00t\"))
这将返回#t,因为\“ w00t \”是一个字符,后跟两个数字,后跟一个字符。 我推测您在方案的语法规则方面仍然有困难,而不仅仅是特定程序的逻辑问题。您可能想尝试一个更简单的练习。 更新2:您不应该考虑提出一个新问题吗? 您最近的更新已破坏代码。 fsm的过渡部分起作用了,因为过渡被定义为一个列表:
(from-state test-function to-state)
您尝试创建过渡:
(from-state string-literal to-state)
您可以将
(A,\"a\",B)
更改为
(A (lambda (x) (string=? x \"a\") B)
。 当您尝试调用函数时,您采用了一个期望一个字符列表并给它一个字符串列表的函数。这些不是一回事。另外,您是否注意到您在列表中放入了逗号,但是代码中没有逗号?这些错误是为什么我建议您开始一个方案教程的原因。这些是基本的计划问题,与您的特定锻炼无关。我建议您将编辑内容恢复到昨天的内容。 不幸的是,我无法再更新此答案。我想更新我的答案,以便如果有人对您的问题有类似的关注,他们会看到完整的答案。但是,您提供了一个移动目标。请考虑停止编辑,并在提交新问题时提交新问题。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-