这个Prolog谓词中的第二个参数是做什么的?它为什么空?

时间:2015-09-28 15:48:03

标签: prolog dcg

在Prolog中详细说明DCG的this page中,它提供了以下示例语法:

s  -->  np,vp. 

np  -->  det,n. 

vp  -->  v,np. 
vp  -->  v. 

det  -->  [the]. 
det  -->  [a]. 

n  -->  [woman]. 
n  -->  [man]. 

v  -->  [shoots].

可以这样使用:

s([a,woman,shoots,a,man],[]).

第二个参数是做什么的?为什么[]或空?我认为你只需要致电s([a,woman,shoots,a,man]).,但它不起作用。

有人可以解释一下空白列表在这里完成了什么以及它做了什么?

1 个答案:

答案 0 :(得分:3)

我强烈建议始终使用phrase/2界面访问DCG。

原因是你不应该依赖DCG条款的任何特定扩展方法。您的系统可能会按照本页所述的方式扩展DCG,但依赖此属性会阻止许多原本可能实现的优化。

在您的情况下,您应该阅读phrase/2的含义,并按照以下方式使用它:

?- phrase(NT, Ls).

表示DCG非终结NT描述列表Ls

因此,你注意到你甚至没有在这里看到任何空列表!因此,使用phrase/2可以使初学者更容易使用DCG,而不是考虑其他参数。

如果您确实需要访问列表的其余部分(有时是有用的),则可以始终使用phrase/3。事实上,phrase(NT, Ls)phrase(NT, Ls, [])的简写,但您不需要这么快就担心。当你有更多的Prolog经验时,你会自然而然地想到这一点。