非常基本的dcg prolog语法

时间:2012-12-16 15:40:26

标签: prolog dcg

我试图理解prolog和明确的句子语法,但我很难理解它们。

我真的想了解如何使用dcg语法......

这里我有两个例子:

第一个实际上是该论坛上另一个问题的代码,但还有一个问题:

代码看起来像这样:

s --> first, operator, second.
first --> [X].
operator --> ['+'].
second --> [X].

当Prolog被问到这个问题时,它会返回true / false但是我不能为我的生活找出如何实际修改它来“绑定”这个值,所以如果问到s(X,[2,+ ,2],[])。它会返回first的值,所以不是返回true,而是说X = 2

无论如何回到实际问题。我在普通的prolog中有一些规则,这是其中之一;它实际上并没有做任何事情,只是作为一个例子。

do(X, Y, [H|T], Sum):-
    H == 1, %check if H is 1
    X = H,
    Y = T,
    Additional is H+5,
    Sum is Additional+Additional.

基本上,我问是否有人可以将此翻译成DCG,以便我可以尝试理解DCG的基本语法!我试过阅读一些教程,但我觉得我没有更聪明......

2 个答案:

答案 0 :(得分:2)

DCG:     foo(A1,A2,A3,...,An) - >杆

的Prolog:     foo(A1,A2,A3,...,An,X,Y): - bar(X,Y)

因此,s应更改为:

s(X) --> first(X), operator, second.
first(X) --> [X].
operator --> ['+'].
second --> [X].

当然,返回实际结果可能会更好;为此,您应该在使用{}

完成的DCG子句中封装prolog代码
s(Z) --> first(X), operator, second(Y), {Z is X+Y}.
first(X) --> [X].
operator --> ['+'].
second(X) --> [X].

(当然,如果你有更多的运算符,prolog代码就不那么简单了。)

关于do/4谓词,它应该是这样的:

do(X,Y,[H|T],Sum) -->
   {H == 1, %check if H is 1
    X = H,
    Y = T,
    Additional is H+5,
    Sum is Additional+Additional}.

但我不明白为什么你会这么想。

最后一个提示:建议使用phrase/3,而不是在DCG谓词中添加最后两个参数。

答案 1 :(得分:1)

以有意义的方式将do / 4翻译成DCG并不容易。我删除了“复制”DCG的隐藏参数的参数。

do(Sum) -->
    [1],  %check if H is 1
    {  % braces allow 'normal' Prolog code (but we have no access to 'hidden' arguments)
    Additional is H+5,
    Sum is Additional+Additional
    }.

修改抱歉我在Additional is H+5,忘记了H,应该阅读Additional is 1+5, ...