什么时候在 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。
但对于正常使用 - 词法分析和生成 - 短语是可行的方法。
我正在尝试了解有关 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。
但对于正常使用 - 词法分析和生成 - 短语是可行的方法。