-->
在Prolog中的含义是什么?
你能提供一个具体的例子并解释它是如何运作的吗?
答案 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
答案 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在输出方面只有微小的差异。