如果Prolog中的查询无效,是否存在SLD树?

如果Prolog中的查询无效,是否存在SLD树?,prolog,Prolog,考虑以下Prolog程序: reverse_bits([1], [0]). reverse_bits([0], [1]). reverse_bits([H|T], [0|R]) :- H==1, reverse_bits(T, R). reverse_bits([H|T], [1|R]) :- H==0, reverse_bits(T, R). 以上问题的SLD树是什么 reverse_bits(Input, [1, 0, 0]).? 它是无效的,所以它是否存在SLD树?下面是使用sldnf

考虑以下Prolog程序:

reverse_bits([1], [0]).
reverse_bits([0], [1]).
reverse_bits([H|T], [0|R]) :- H==1, reverse_bits(T, R).
reverse_bits([H|T], [1|R]) :- H==0, reverse_bits(T, R).
以上问题的SLD树是什么

reverse_bits(Input, [1, 0, 0]).?

它是无效的,所以它是否存在SLD树?

下面是使用sldnfdraw包的一个简单示例。首先,使用中指定的语法生成程序和查询:

接下来,为相关分辨率树生成.tex文件:

?- draw_goal('estamos-tree.tex').
您可以从命令行运行此目标。最后,将此文件包含在.tex文档中

并用

$ latex estamos-tree-draw.tex
$ dvipdf estamos-tree-draw.dvi
源文件夹中应该有一个.pdf文件,其中包含解析树

代码改进 出于价值考虑,我建议将您的程序编写为:

reverse_bits([],[]).
reverse_bits([0|T],[1|R]) :- reverse_bits(T,R).
reverse_bits([1|T],[0|R]) :- reverse_bits(T,R).
为简单起见,并避免使用==代替统一,如注释中指出的false

使用时输出=统一 在这里,我们在测试H的保护部分中使用=统一

使用==术语等价时的输出 当使用==时,我们很快就完成了,因为第一次调用失败:


因为唯一匹配的子句是reverse_bits[H | T],[1 | R]:-H==0,reverse_bitsT,R。在这一点上,H是一个新变量,绝不等于0。

这里是一个使用sldnfdraw包的最小示例。首先,使用中指定的语法生成程序和查询:

接下来,为相关分辨率树生成.tex文件:

?- draw_goal('estamos-tree.tex').
您可以从命令行运行此目标。最后,将此文件包含在.tex文档中

并用

$ latex estamos-tree-draw.tex
$ dvipdf estamos-tree-draw.dvi
源文件夹中应该有一个.pdf文件,其中包含解析树

代码改进 出于价值考虑,我建议将您的程序编写为:

reverse_bits([],[]).
reverse_bits([0|T],[1|R]) :- reverse_bits(T,R).
reverse_bits([1|T],[0|R]) :- reverse_bits(T,R).
为简单起见,并避免使用==代替统一,如注释中指出的false

使用时输出=统一 在这里,我们在测试H的保护部分中使用=统一

使用==术语等价时的输出 当使用==时,我们很快就完成了,因为第一次调用失败:


因为唯一匹配的子句是reverse_bits[H | T],[1 | R]:-H==0,reverse_bitsT,R。在这一点上,H是一个新变量,绝不等于0。

为什么你认为它是无效的?事实并非如此;这是一个恰巧失败的完全有效的查询。因此SLD树是存在的,经过充分的探索,并没有找到解决方案==/2是一个元逻辑谓词。然后你得到你的SLDtree@WillNess是的,你是对的,这个查询是有效的,但它失败了。有一个swi包:SLDNFDRAW实际上SLD树在一阶经典逻辑片段中使用矛盾证明和解析证明的证明树不存在,因为如false所述,其中有一个==,这在那种环境下毫无意义。运行设置中的调用树使用统一和从左到右的调用顺序,排除偶然和其他魔法,试图通过确认返回真实证据?沿着所有的分支,模糊地工作在一个直觉一阶逻辑片段中确实存在。你为什么认为它是无效的?事实并非如此;这是一个恰巧失败的完全有效的查询。因此SLD树是存在的,经过充分的探索,并没有找到解决方案==/2是一个元逻辑谓词。然后你得到你的SLDtree@WillNess是的,你是对的,这个查询是有效的,但它失败了。有一个swi包:SLDNFDRAW实际上SLD树在一阶经典逻辑片段中使用矛盾证明和解析证明的证明树不存在,因为如false所述,其中有一个==,这在那种环境下毫无意义。运行设置中的调用树使用统一和从左到右的调用顺序,排除偶然和其他魔法,试图通过确认返回真实证据?沿着所有的分支,模糊地工作在一个直觉一阶逻辑片段中确实存在。这很好!我在Fedora 30上试过这个。输出添加!虽然所有这些都很好,但要使图像的使用更加有用,还有一个步骤就是将其转换为SVG,这是所有常见的Internet浏览器都支持的,并且是可伸缩的,请参见:LaTeX/Export to Other format@false-false-Actually-like,一个真正的SVG。另一个是使用Logtalk生成的。@GuyCoder:causa finita:未能上载图像;不支持该格式。因此SVG与EPS是不可移植的一样,是在创建Prolog上的注释时要考虑的另一个站点,并且希望添加图形将被使用。也许会有帮助这太好了!我在Fedora 30上试过这个。输出添加!虽然所有这些都很好,但要使图像的使用更加有用,还有一个步骤就是将其转换为SVG,这是所有常见的Internet浏览器都支持的,并且是可伸缩的,请参见:LaTeX/Export to Other format@false-false-Actually-like,一个真正的SVG。另一个是使用Logtalk生成的。@GuyCoder:causa finita:未能上载图像;不支持该格式。所以SVG就像EPS是另一个站点一样,是不可移植的。 在Prolog上创建注释并希望添加图形是很有用的。可能会有帮助