什么 - >在prolog中意味着什么?

时间:2015-03-06 06:19:18

标签: prolog dcg

-->在Prolog中的含义是什么?

你能提供一个具体的例子并解释它是如何运作的吗?

2 个答案:

答案 0 :(得分:4)

hardmath已经解释了很多。但DCG更令人着迷的是,虽然 - > / 2语法表明无上下文语法,但实际上更多。人们还可以通过属性来建模更复杂的语言,这些属性只是非终端的参数。

这是一个生成并接受语言L = {a ^ n b ^ n c ^ n}的DCG。 DCG的内容如下:

:- use_module(library(clpfd)).

start(N) --> as(N), bs(N), cs(N).

as(N) --> {N #> 0, M #= N-1}, [a], as(M).
as(0) --> [].

bs(N) --> {N #> 0, M #= N-1}, [b], bs(M).
bs(0) --> [].

cs(N) --> {N #> 0, M #= N-1}, [c], cs(M).
cs(0) --> [].

上面的代码使用了{}所谓的辅助条件(*),这是散布在DCG中的普通代码。并且为了允许双向使用DCG,我们使用CLP(FD)而不是普通算术。以下是SWI-Prolog中的一些示例运行:

?- phrase(start(X),[a,a,a,b,b,b,c,c,c]).
X = 3 
?- phrase(start(3),Y).
Y = [a,a,a,b,b,b,c,c,c]

但在实践中,经常会发现DCG,因为它们能够绕过状态。它们允许在Prolog中使用一种形式的monad。只需用输入状态和输出状态替换输入列表和输出列表。

再见

(*) 促进DCG的早期论文是:

Pereira,F.C.N。和沃伦,D.H.D。 (1980):
语言分析的明确条款语法 -
形式主义概述及与中国的比较 增强型过渡网络,北荷兰 出版公司,人工智能,13,231 - 278

http://cgi.di.uoa.gr/~takis/pereira-warren.pdf

答案 1 :(得分:0)

符号-->在许多Prolog实现中用于创建声明性条款语法(DCG)规则,其形式如下:

head --> body.

与正常的Prolog规则类似:

head :- body.

事实上,每个DCG规则都可以转换为普通的Prolog规则(并且在内部),但DCG语法可以作为一种方便且非常强大的简写,用于创建将列表与各种Prolog结构相关联的规则。 DCG规则通常用于解析列表的相当有限的目的。

这里提出的问题是给出一个使用-->的简单示例,换句话说,显示DCG规则在一个简单的情况下是如何工作的。 DCG规则的头部实际上是一个基础Prolog规则的谓词,其中有两个额外的参数代表差异列表,即一个列表表示为较长的列表减去该较长列表的一些尾部。< / p>

这是一个DCG的例子,取自Ann Ogborn在Markus Triska的教程SWI-Prolog DCG tutorial中改编的given in Boris's Comment

as --> [ ].           % empty list is okay
as --> [a], as.       % list [a|T] is okay iff T is okay

为了将它与普通的Prolog谓词区分开,我们将其表示为as//0,但它等同于具有两个附加参数的普通Prolog谓词。我们可以通过提供另外两个参数来直接查询基础Prolog谓词:

?- as([ ],[ ]).
true

这是成功的,因为根据as//0,两个列表(也是一个空列表)之间的差异是可以的。也:

?- as([a],[ ]).
true

成功,因为两个列表之间的差异为[a],通过递归as//0就可以了。

另一种使用as//0的方法是使用内置的Prolog谓词phrase/2,它将第一个参数作为DCG头,第二个参数作为列表。在这种情况下,phrase/2将生成满足as//0的列表:

?- phrase(as, Ls).
Ls = '[]' ;
Ls = [a] ;
Ls = [a, a] ;
Ls = [a, a, a] ;

依此类推,直到你通过点击返回来成功终止查询。

此示例也适用于Amzi! Prolog在输出方面只有微小的差异。