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

时间:2015-12-03 21:33:45

标签: prolog dcg

我试图在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)的区别是什么?什么时候应该使用短语?

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

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

此外,为了允许使用DCG并执行“状态线程”,即将状态传播切换到隐藏参数,已引入call_dcg / 3。

但是对于正常使用 - 词法解析和生成 - 短语是要走的路。