什么时候在 Prolog 中使用短语?

When to use phrase in Prolog?

我正在尝试了解有关 Prolog 中 DCG 的更多信息,并且在阅读不同来源时,我注意到在某些情况下没有使用短语?

从 Learn Prolog Now 网站,它展示了这个例子:

s   -->  np,vp. 
np  -->  det,n. 
vp  -->  v,np. 
vp  -->  v. 
det -->  [the]. 
det -->  [a]. 
n   -->  [woman]. 
n   -->  [man]. 
v   -->  [shoots].

然后他们使用查询 s(X,[]) 生成语法中的所有句子。 我试过 phrase(s,L) 它也生成了语法描述的所有句子。

使用s(X,[])phrase(s,L)有什么区别?什么时候应该用短语?

应始终使用 phrase/2-3 谓词访问语法规则。当第一个参数被实例化时,Prolog 编译器应该将 phrase/2-3 调用转换为对被调用语法规则编译生成的谓词的调用。因此,使用 phrase/2-3 谓词应该没有开销。

实际上,SWI-Prolog 执行类型检查(参数必须正确列出),然后在使用 phrase/3 时表现出性能损失。

此外,为了允许使用 DCG 并执行 'state threading',即将状态传播传递给隐藏参数,引入了 call_dcg/3。

但对于正常使用 - 词法分析和生成 - 短语是可行的方法。