Prolog正确调用DCG功能

时间:2013-12-05 04:54:10

标签: prolog grammar dcg

我想要模拟此代码的DCG格式:

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

并调用:

 ?- phrase(s, X).

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

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

对于短语部分,我不知道如何将这些规则称为短语?

1 个答案:

答案 0 :(得分:0)

DCG通常实现向规则添加一对参数,以获得完成解析所需的快速列表处理,称为差异列表的基本技术的应用< / em>的。您可以使用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).

短语/ 2'只是'将令牌'列表与第一个语法(隐藏)参数相关联,并将空列表与第二个隐藏的列表相关联,表示整个令牌'列表必须通过解析来消费。

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

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