我想要模拟此代码的DCG格式:
s --> [a].
s --> s, s.
并调用:
?- phrase(s, X).
我用下面的代码编写了,但缺少了一些东西。
rule(s,[a]).
rule(s,[s,s]).
对于短语部分,我不知道如何将这些规则称为短语?
答案 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的情况下,很难给出任何明智的提示......