在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]).
,但它不起作用。
有人可以解释一下空白列表在这里完成了什么以及它做了什么?
答案 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经验时,你会自然而然地想到这一点。