这个 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 有更多的经验时,它会自然而然地出现。
在 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 有更多的经验时,它会自然而然地出现。