我试图在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)
的区别是什么?什么时候应该使用短语?
答案 0 :(得分:3)
应始终使用phrase/2-3
谓词访问语法规则。当第一个参数被实例化时,Prolog编译器应该期望将phrase/2-3
调用转换为对由调用语法规则的编译生成的谓词的调用。因此,使用phrase/2-3
谓词不应该有任何开销。
答案 1 :(得分:3)
实际上,SWI-Prolog执行类型检查(参数必须是正确的列表),然后在使用短语/ 3时表现出性能损失。
此外,为了允许使用DCG并执行“状态线程”,即将状态传播切换到隐藏参数,已引入call_dcg / 3。
但是对于正常使用 - 词法解析和生成 - 短语是要走的路。