【问题标题】:Prolog invoking DCG functions properlyProlog 正确调用 DCG 功能
【发布时间】:2013-12-05 04:54:10
【问题描述】:

我有想要模拟这段代码的 DCG 格式:

 s --> [a].
 s --> s, s.

并调用:

 ?- phrase(s, X).

我用下面的代码弥补了,但缺少一些东西。

rule(s,[a]).
rule(s,[s,s]).

对于短语部分,我不知道如何调用这些规则,例如短语?

【问题讨论】:

  • 你想多了。将两个语法规则(s --> [a]. 和另一个)放入一个文件并让 Prolog 查询它。然后您可以执行phrase(s, X) 查询,它将起作用。你的rule/2 东西都不是必需的。

标签: prolog grammar dcg


【解决方案1】:

DCG 通常实现为添加一对规则的参数,以获得完成解析所需的快速列表处理,这是一种称为差异列表的基本技术的应用。您可以使用 Listing/1 检查翻译:

?- [user].
|: s --> [a].
|: s --> s, s.
% user://1 compiled 0.04 sec, 4 clauses

?- listing(s).
s([a|A], A).
s(A, C) :-
    s(A, B),
    s(B, C).

phrase/2 'just' 将标记列表与第一个语法(隐藏)参数相关联,并将空列表与第二个隐藏参数相关联,这意味着 整个标记列表必须被解析消耗掉。

由于您正在模拟 DCG,因此您的任务应该简化为在代码中添加令牌列表。如果代码正确实现(不容易做到正确),模拟将能够解析并生成任何合法短语。在您的情况下,至少有 1 个a 的序列。

在不知道您如何解释您的规则/2 的情况下,很难给出任何明智的提示...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多