我试图理解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的基本语法!我试过阅读一些教程,但我觉得我没有更聪明......
答案 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].
当然,返回实际结果可能会更好;为此,您应该在使用{}
:
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,
...