14

(根据@repeat 的建议)考虑一个程序的查询1 ?- G_0.查询有什么用处?- G_0, G_0.

脚注
1 没有表格(为了安全起见),约束是可以的。
上一篇关于这个主题的文章。

4

2 回答 2

5

该查询?- G_0, G_0.有助于识别冗余答案?- G_0.

为此,只需将 的答案数量与 的答案数量进行比较?- G_0.即可?- G_0, G_0.。无需存储这些答案(无论如何这是错误的常见来源)。两个整数就够了!如果它们相等,则没有冗余。但是如果?- G_0, G_0.有更多的答案,那么就会有一些冗余。这是一个例子:

p(f(_,a)).
p(f(b,_)).

?- p(X).
   X = f(_A, a)
;  X = f(b, _A).  % two answers

?- p(X), p(X).
   X = f(_A, a) 
;  X = f(b, a)
;  X = f(b, a)
;  X = f(b, _A).   % four answers
                   % thus p(X) contains redundancies

...现在让我们解决这个问题:

p(f(B,a)) :-
   dif(B, b).
p(f(b,_)).

?- p(X).
   X = f(_A, a), dif(_A, b)
;  X = f(b, _A).

?- p(X), p(X).
   X = f(_A, a), dif(_A, b), dif(_A, b).
;  X = f(b, _A).    % again two answers, thus no redundancy

无需手动检查所涉及的约束。

当我们仅使用 显式搜索冗余答案时,这可以进一步扩展call_nth/2

?- G_0, call_nth(G_0, 2).
于 2020-02-28T18:28:36.537 回答
1

考虑一个纯程序 1 ?- G_0 的查询。如果有的话,查询有什么用?- G_0,G_0。有?

我认为第二个目标没有用处,尤其是当尾递归优化最后调用优化)为ON时。

当查询是资源贪婪且以上选项关闭(例如调试时)时,我可以实现 GC 问题(堆栈/堆溢出)。

我认为第二个调用是多余的(对于纯程序),应该被编译器消除。

于 2020-02-25T05:27:49.163 回答