删除 DCG 中的左递归 - Prolog

2024-02-21

我在这个语法中遇到了一个关于左递归的小问题。我正在尝试用 Prolog 编写它,但我不知道如何删除左递归。

<expression> -> <simple_expression>
<simple_expression> -> <simple_expression> <binary_operator> <simple_expression>
<simple_expression> -> <function>
<function> -> <function> <atom>
<function> -> <atom>
<atom> -> <number> | <variable>

<binary_operator> -> + | - | * | /

expression(Expr) --> simple_expression(SExpr), { Expr = SExpr }.
simple_expression(SExpr) --> simple_expression(SExpr1), binary_operator(Op), simple_expression(SExpr2), { SExpr =.. [Op, SExpr1, SExpr2] }.
simple_expression(SExpr) --> function(Func), { SExpr = Func }.
function(Func) --> function(Func2), atom(At), { Func = [Func2, atom(At)] }.
function(Func) --> atom(At), { Func = At }.

我写过类似的东西,但根本行不通。如何更改它才能使该程序运行?


你的程序的问题确实是左递归;应该将其删除,否则您将陷入无限循环

要删除立即左递归,请替换表单的每个规则

A->A a1|A a2|....|b1|b2|....

with:

A -> b1 A'|b2 A'|....
A' -> ε | a1 A'| a2 A'|....

所以函数是

function -> atom, functionR.
funtionR -> [].

维基页面 https://secure.wikimedia.org/wikipedia/en/wiki/Left_recursion

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

删除 DCG 中的左递归 - Prolog 的相关文章

  • 将 BNF 转换为 Parsec 程序有什么技巧吗?

    匹配函数调用链的 BNF 如x y z expr term T T expr T EMPTY term expr VAR 将其转换为秒差距程序 看起来很棘手 term Parser Term term parens expr lt gt v
  • 如何声明两个列表具有相同的长度?

    我需要知道如何比较 Prolog 中两个列表的长度 这是我到目前为止所拥有的 sum N1 N2 checklength N1 N2 checklength N1 N2 L1 is length N1 What L2 is length N
  • Prolog 程序从列表中删除每个第 n 个元素

    您能帮我解决以下问题吗 编写三元谓词delete nth从列表中删除每个第 n 个元素 样本运行 delete nth a b c d e f 2 L L a c e false delete nth a b c d e f 1 L L f
  • 如何在 SWI-Prolog 中创建事实?

    我只想创建类似的东西 like x y 我已经尝试了很长时间了 真的很沮丧 谁能告诉我该怎么做 我假设您正在交互地使用 swi 并尝试输入事实会给您一个如下错误 1 like x y ERROR toplevel Undefined pro
  • Prolog,如何在 write() 中显示多个输出

    go match Mn Fn write Matching Result nl write Mn write match with write Fn match Mn1 Fn1 person may female 25 blue perso
  • 解析树和语法信息

    有谁知道在哪里可以找到好的在线资源以及如何制作语法和解析树的示例 最好是介绍材料 信息是 n00b 友好的 我自己在 Google 上没有找到任何好的信息 Edit 我正在考虑理论 而不是特定的解析器软件 网上没有 不过也许你应该看看编译器
  • 如何在 Prolog 中为变量(如字符串)分配多个值?

    今天早些时候 我寻求帮助以在序言中构建数据库以及如何通过参数搜索 有人提出了这个 您还可以向每个处理器添加术语列表 例如 processor pentium g4400 brand intel family pentium series g
  • Prolog - 从列表中删除具有相同第一个值的对

    我有这样的对象列表 list obj x y obj x z obj a b obj b c 我想删除那些共享相同第一个值的元素 这样我就可以使用修改后的列表 在这种情况下 最终列表将如下所示 list obj a b obj b c 有人
  • Prolog 同构图

    这里尝试解决同构图问题 作业信息 判断2个无向图是否同构 没有孤立的顶点 顶点数小于30 图的边作为谓词给出 即 e 1 2 f 1 2 我正在尝试使用以下方法 对于每对边 即图 1 和图 2 中的每条边 Try to bind the v
  • 实现类 Markdown 语言的解析器

    我有类似于 markdown 和 SO 使用的标记语言 遗留解析器基于正则表达式 维护起来简直是噩梦 因此我提出了自己的基于 EBNF 语法的解决方案 并通过 mxTextTools SimpleParse 实现 但是 某些令牌可能存在相互
  • Prolog 匹配 vs miniKanren 统一

    在 Prolog 人工智能编程中 Bratko 在第 58 页说了以下内容 Prolog 中的匹配对应于逻辑中所谓的统一 但是 我们避免使用 统一 这个词 因为出于效率原因 在大多数 Prolog 系统中 匹配的实现方式并不完全对应于统一
  • Prolog 实现 and/2、or/2、nand/2、nor/2、xor/2 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想在序言中实现以下谓词并将它们用于真值表 and 2 or 2 nand 2 nor 2 xor 2 也许有人可以告诉我如何实现和
  • 在 prolog 中读取用户输入的字符串

    我是 Prolog 初学者 我正在使用 swi prolog 刚刚开始使用它 我需要将用户输入字符串拆分到列表中 我尝试了以下代码 但出现错误 指出 在子句正文中完全停止 无法重新定义 2 write Enter the String nl
  • 列表中的连续元素

    我正在阻止一个谓词来编码Prolog 我需要对两个谓词进行编码 如果我打电话 u a b c d e f X 它会给X a b X b c X c d 如果我打电话 v a b c d e f X 它会给X a b X c d X e f
  • 适合从记录中提取 OneToMany 关系的约束编程

    也许有人可以帮助我解决 Prolog 或任何约束编程语言的问题 想象一个项目表 学生与母亲一起做某事的学校项目 每个项目都有一名或多名儿童参与 对于每个孩子 我们存储其姓名及其母亲的姓名 但对于每个项目 只有一个包含所有母亲的单元和一个包含
  • 问题 - 序言中的形式语言

    我正在尝试构建一个 DCG 它可以识别与此形式匹配的所有列表 a n b 2m c 2m d n 我写下了以下规则 s gt s gt ad ad gt a ad d ad gt bc bc gt b b bc c c bc gt a gt
  • 如何为有效号码指定 DCG?

    我正在尝试为有效数字指定 DCG 如下所示 value Number gt valid number Number 基本上检查指定的值是否是数字 它也可能是变量 因此有必要检查 我不知道如何构建这个valid number不过 DCG 谓词
  • F# 和模糊逻辑

    我知道这可能听起来很奇怪 但我想知道 Microsoft Visual F 正在进入的这个新世界中的一件事 这种语言有很多应用 我要学习 关于解析 函数式编程 结构化编程 但是人工智能呢 模糊逻辑有什么应用吗 F 是一种适合模糊逻辑应用程序
  • 用PLY解析python,如何编码缩进和缩进部分

    我试图用 PLY 解析 python 语言的函数定义 我遇到了与缩进相关的问题 例如 对于 for 语句 我希望能够知道块何时结束 我在这里阅读了python语法 http docs python org 2 reference gramm
  • 根据一个值找到列表内列表的最小值

    我在序言中有这个列表 dublin london 1000 dublin moscow london 5000 我想计算列表的最小值 这样答案应该是 dublin london 1000 这个问题有一些类似的问题序言中列表列表中的最小值 h

随机推荐

  • 使用winsock发送位图

    如何通过 winsock 发送位图而不将其保存到文件然后发送 如果您知道如何在收到数据后将数据转换回位图 这也会很有帮助 您使用什么编程语言 基本上 您必须将位图数据存储到某种字节缓冲区中 然后通过线路发送字节 并从另一端的字节缓冲区中读回
  • 如何使用 INotifyPropertyChanged 更新数组绑定?

    假设我有一堂课 class Foo public string Bar get public string this int index get 我可以使用 Binding Path Bar 和 Binding Path x 绑定到这两个属
  • 模式匹配instanceof

    我在上遇到了这个令人惊奇的话题https www baeldung com java pattern matching instanceof https www baeldung com java pattern matching inst
  • Ionic2 中的多个 $http 请求

    我想知道是否有多个请求 if my http request 1开始吧 比方说 http request 1结束并尝试打电话 http request 2 我的问题如何创建多个请求 例如 打电话 http request 1 then ht
  • 通用图像加载器重用图像

    使用通用图像加载器 是否可以直接将图像保存到磁盘并在应用程序的不同运行之间重复使用这些图像 I know imageLoader displayImage imageURI itemHolder image options 第二次从缓存中获
  • 无法打开资源文件,pygame 错误:“FileNotFoundError:没有这样的文件或目录。”

    Import pygame pygame init BG pygame image load pycache test bg jpg def DrawGameWin window blit BG 0 0 pygame display upd
  • 浏览器使用 AJAX + setInterval 不断消耗内存

    我需要使用 JavaScript 在给定的时间间隔内更新大量数据 问题是 无论我使用什么 JS 库 甚至是裸机 js 所有浏览器似乎都会在每个 AJAX 请求上分配内存 并且之后无法释放它 这是一个应该重现错误的示例片段
  • 使用 clang 优化编译时出现意外结果

    我在代码中发现了一个错误 该错误仅在启用编译器优化 O1 或更高版本时才会发生 我跟踪了该错误 似乎在启用优化时我无法在升压转换范围上使用升压 type erased 适配器 我编写了这个 C 程序来重现它 include
  • 命令行命令中的“$”是什么意思?

    我经常发现命令行命令以美元符号在安装许多东西的说明中 例如安装Ruby in Ubuntu 该网站说使用以下命令 sudo apt get install ruby full 什么是 代表 The 不是命令的一部分 它告诉您该命令需要以普通
  • 在 Ruby on Rails 中使用 mini_magick 将 pdf 转换为 png

    背景 我从 API 调用中检索了二进制形式的 pdf base 64 binary data response label generate label response response shipments response shipme
  • ASP3 和 ASP.NET 会话共享

    有没有办法在 ASP3 和 ASP NET 之间共享会话 Thanks 尽管 Microsoft 尽最大努力使 ASP 和 ASP NET 轻松共存 但有一个领域仍然是一个绊脚石 会话状态 幸运的是 ASP NET 升级的会话状态管理的优点
  • JavaScript 在 Android WebView 中不起作用

    我想通过 webView 加载 url 网址是http wapp baidu com f kw BB F0 BC FD http wapp baidu com f kw BB F0 BC FD 此页面可以在系统默认浏览器上正常工作 但在我的
  • 如何使项目浮动在 Jquery 对话框之外

    我想要一个看起来像这样的对话框 我认为这种方法可行 但我想我错了 JavaScript Creates The Dialog ImageDialogDiv dialog position 98 223 resizable false mod
  • jQuery 提交验证,最后有模式对话框?

    我现在有一个表格想要验证 假设一切都正确 我希望它弹出一个对话框确认其详细信息 这是我迄今为止的代码示例 var userConfirmed false dialog dialog buttons Yes function userConf
  • 如何理解ndarray.reshape函数?

    原型为reshape 就是它reshape shape order C 形状的类型是元组 所以我们应该用以下方式调用这个函数myarray reshape 1000 1 32 32 但是我发现很多人用myarray reshape 1000
  • 如何使 Apache mod_deflate 和 Transfer-encoding : Chunked 一起工作?

    我正在尝试在我们的网站上使用大管道概念 这意味着尝试以块的形式发送响应 而不是整体发送响应 以便用户感觉该页面很快 我通过在 java 中的响应对象上使用flushBuffer方法成功地做到了这一点 但是现在 当我尝试使用 apache m
  • 浮点到字符串:字符串长度问题

    我想将浮点值转换为字符串并创建以下简短示例 with Ada Text IO procedure Example is A constant Float 1 234 B constant Float 123 456 789 C consta
  • 寻找一种算法以(伪)随机顺序吐出数字序列

    假设我有一个数字序列 n n 1 n 2 n m 在不提前存储数字的情况下 我想创建一个函数 f 给定序列 1 2 3 m 将以随机 或至少伪随机 顺序吐出原始集合 例如 假设我的序列是 10 11 12 13 14 15 16 17 f
  • UWP - 调试器已附加到 .exe 但未配置

    I m developing Windows Store App UWP and I have a problem with native code I have this message 此代码第二次或第三次触发后抛出此异常 if Pro
  • 删除 DCG 中的左递归 - Prolog

    我在这个语法中遇到了一个关于左递归的小问题 我正在尝试用 Prolog 编写它 但我不知道如何删除左递归