非常基础的dcg prolog语法

4
我将尝试为您翻译以下技术相关内容,涉及Prolog和确定性子句语法。希望我的翻译能使您更好地理解以下内容:

我正在努力理解Prolog和确定性子句语法,但我发现它们非常难理解。

我真的很想理解如何使用DCG语法...

下面有两个例子:

第一个实际上是来自本论坛的另一个问题的代码,但还有一个额外的问题:

代码如下:

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

当询问Prolog时,它会返回true/false,但我无法弄清楚如何实际修改它以"绑定"值,因此如果询问s(X,[2,+,2],[]),它将返回第一个值,所以它不会返回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个回答

3

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

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

因此,s 应更改为:

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

当然,返回实际结果可能更好;为此,您应该将Prolog代码封装在DCG子句中,使用{}完成:
s(Z) --> first(X), operator, second(Y), {Z is X+Y}.
first(X) --> [X].
operator --> ['+'].
second(X) --> [X].

(naturally, 如果你有更多的操作符,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

将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,...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接