问题标签 [dcg]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
139 浏览

variables - 给定一个替换 S 并列出 Xs,如何将 S 应用于 Xs

假设我有一个替换S并列出Xs ,其中出现在Xs中的每个变量也出现在S中。我如何找到列表S(Xs),即通过将替换S应用于列表Xs获得的列表。

更具体地说,我有一组谓词和 DCG 规则,看起来像

如果我尝试将模式P与变量与列表匹配,我会收到替换S

我想将替换S = {X = c, Y = e}应用于具有变量XY的列表Xs,并接收带有替换的列表,但我不确定解决问题的最佳方法是什么.

如果我在 Haskell 中解决这个问题,我会构建一个从变量到值的有限映射,然后执行替换。等效的方法是在 DCG 规则中生成一个变量和值对的列表,然后使用该映射找到所需的列表。然而,这不是一个合适的方法。

0 投票
2 回答
331 浏览

prolog - 避免 Prolog 中 append/3 的线性成本

让我们假设我们正在从标准输入中读取并构建已读取的所有行的列表。最后,我们需要显示这些行,用逗号分隔。

这段代码的问题是append调用processInput/3成本为 O(n)。我们怎样才能避免这种成本并且仍然让我们的谓词是尾递归的(因为我们可能会从标准输入中读取很多行)?

我突然想到我们可以用append以下内容替换。

我们可以在显示之前反转列表。但这似乎很老套。有没有更好的办法?

0 投票
2 回答
397 浏览

prolog - 使用 DCG 解析变量

我无法使用 Prolog 的 DCG 符号将大写字母开头的序列解析为变量。例如,如果我有字符串

和解析这个字符串的 DCG,有没有办法将每个大写字母解析成一个唯一的 Prolog 变量。例如,解析Y为一个变量,每个解析为X一个变量?预期的应用是构建函子

通过以语句结尾的 DCG 规则

0 投票
3 回答
1224 浏览

parsing - 在没有剪切的情况下解析 Prolog?

我在 Prolog 中找到了这个用于解析 lisp 的好片段(来自这里):

然而,表达式使用剪切。我假设这是为了提高效率。是否可以编写此代码以使其无需剪切即可有效工作?

也会对涉及 Mercury 的软切/承诺选择感兴趣的答案。

0 投票
2 回答
1048 浏览

prolog - 使用 prolog DCG 查找和替换 - 代码审查

我想出了以下代码来替换所有出现的Findw/ ReplaceinRequest并将答案放入Result. 这是使用 DCG,所以它们都是字符代码列表。客户端代码将使用的谓词是substitute.

这适用于 SWI-Prolog。有人对我如何改进它有任何意见吗?我正在学习如何使用 DCG 和差异列表。例如,我加入了剪辑,以便在找到 之后Find,prolog 永远不会回溯并将其解释为[ C ]案例中的普通字符。这是需要的,还是有一种更具声明性的方式?

另一个问题 - 是否已经有一个谓词可以做与替代品相同的事情,也许是在原子上?

提前致谢。

0 投票
1 回答
222 浏览

prolog - 此代码是通过扩展 Prolog DCG 尾递归生成的吗?

以下代码是一个 DCG,用于替换所有出现的Findw/ ReplaceinRequest并将答案放入Result. 感谢 mat,在这个问题中提供代码。

在 SWI-Prolog 中,这扩展为以下内容。

这段代码是尾递归的吗?在 predicate 的第二个定义中的phrase递归调用之后有一个调用。在第三个定义中的递归调用之后还有. 我认为,如果最后进行递归调用,代码将是尾递归的。如果生成的代码不是尾递归的,有没有办法让 Prolog 生成尾递归代码?提前致谢。replacereplaceE=[F|G]replacereplace

0 投票
4 回答
6065 浏览

list - 反向/回文的递归 Prolog 谓词

  1. 我可以得到一个递归 Prolog 谓词,它有两个参数,称为 reverse,它返回一个列表的倒数:

    示例查询和预期结果:

    /li>
  2. palindrome如果给定列表是回文,则调用两个参数的递归 Prolog 谓词,该谓词返回 true。

    具有预期结果的示例查询:

    /li>
0 投票
2 回答
655 浏览

prolog - Prolog:将 DCG 语法与其他限制相结合

Prolog 的 DCG 给我留下了深刻的印象,而且我能够以多快的速度生成适合特定语法的所有可能结构。

但我想将此搜索与其他约束结合起来。例如,定义一个复杂的语法并要求 Prolog 生成所有不超过 10 个单词的句子。或所有不重复相同单词两次的句子。

是否可以将这样的额外约束添加到 DCG 语法?还是我基本上必须将 DCG 翻译回正常的 Prolog 子句并开始修改它们?

0 投票
2 回答
240 浏览

parsing - Prolog DCG 的多种功能?

据我了解,在 Prolog 中,您在解析时捕获功能,如下所示:

这在设计 DCG 时很常见吗?

0 投票
2 回答
828 浏览

prolog - 使用 phrase_from_file 读取文件的行

我一直在尝试使用phrase_from_file语法规则解析包含整数行的文件

因此:phrase_from_file(line,'input.txt').

它失败了,我很快就迷路了,试图追踪它。我什至尝试过 print I,但它甚至没有到达那里。

编辑:: 由于以下解决方案都没有真正适合我的需求(read/1假设您正在阅读术语,有时写 DCG 可能需要太长时间),我蚕食了我在谷歌上搜索的这段代码,主要变化是添加: