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

What is the second parameter in this Prolog predicate doing? Why is it empty?

this page 详细介绍 DCGs in Prolog 中,它提供了以下示例语法:

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]). 但它不会起作用。

有人可以解释一下传递空列表的目的及其作用吗?

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

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

对于您的情况,您应该仔细阅读 phrase/2 的含义,并像这样使用它:

?- phrase(NT, Ls).

意思是DCG非终结符NT描述了列表Ls

因此,您注意到您在这里甚至看不到任何空列表!因此,使用 phrase/2 使初学者使用 DCG 比考虑额外的参数更容易。

如果您确实需要访问列表的其余部分(这有时很有用),您始终可以使用 phrase/3。事实上,phrase(NT, Ls)phrase(NT, Ls, []) 来说是 shorthand,但你不必这么快就担心这个。当你对 Prolog 有更多的经验时,它会自然而然地出现。