gpt4 book ai didi

prolog - (\+)//1 的合法使用

转载 作者:行者123 更新时间:2023-12-04 08:27:27 25 4
gpt4 key购买 nike

在语法规则 ( ) 中,有几个预定义的结构: (',')//2意思是串联,('|')//2意思是交替等。一种被几个但不是所有 Prolog 系统支持的结构是 (\+)//1 .

就个人而言,我使用它只是为了使用它。我从未在其他人编写的代码中看到过。

那么,(\+)//1 是否有合法用途? ?

编辑:此外,(\+)//1 是否有合法用途?在查询中 phrase(nt, L)L一个未实例化的变量。

最佳答案

\+ 可用于创建不那么模糊的语法。
使用\+ 而不是 !例如,是某个
\+ 的声明性,例如产生的 DCG
规则可以重新排序。

让我们举个例子,考虑以下语法:

s([X|Y]) --> t(X), s(Y).               % 1
s([]) --> []. % 2

t(2) --> [a,a]. % 3
t(1) --> [a]. % 4

上面的语法是高度歧义的,例如我得到多个
解析以下输入:
?- phrase(s(A),[a,a,a,a,a]).
A = [2,2,1] ;
A = [2,1,2] ;
A = [2,1,1,1] ;
etc..

现在假设我更喜欢 t 的长解析而不是
t 的简短解析。我可以通过如下切割来做到这一点:
t(2)     --> [a,a], !.                 % 5
t(1) --> [a]. % 6

?- phrase(s(A),[a,a,a,a,a]).
A = [2,2,1] ;
No

不幸的是,我无法重新订购。由于做了以下
没有给出想要的结果。虽然 s(A) 现在产生
结果以不同的顺序,我们回到第一个,
因为语法又是模棱两可的:
t(1)     --> [a].                      % 7
t(2) --> [a,a], !. % 8

?- phrase(s(A),[a,a,a,a,a]).
A = [1,1,1,1,1] ;
A = [1,1,1,2] ;
A = [1,1,2,1] ;
etc...

现在让我们用\+ 试试同样的方法。我们可以更换切口
通过以下否定:
t(2)     --> [a,a].                    % 9
t(1) --> [a], \+ [a]. % 10

?- phrase(s(A),[a,a,a,a,a]).
A = [2,2,1] ;
No

现在让我们试试我们是否可以重新排序。我们重新排序
t//1的语法规则:
t(1)     --> [a], \+ [a].              % 11
t(2) --> [a,a]. % 12

?- phrase(s(A),[a,a,a,a,a]).
A = [2,2,1] ;
No

声明性非常有用。这意味着例如
我们可以在从右到左的图表解析器中使用\+
以任意顺序选择语法规则。这
声明性确保自下而上的前向链接
图表解析器产生相同的结果,独立于
DCG 规则的输入顺序。

然后就可以将 DCG 技术应用于大
自然语言 (NL) 项目并且它的扩展性很好。这
NL 语法可以根据经验调整为确定性。
越确定的文法效率越高
它的解析。复杂的 NL 语法,否则
棘手变得可行。

再见

关于prolog - (\+)//1 的合法使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12758567/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com