Answers:
该查询?- 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).
考虑对纯程序1?-G_0的查询。查询有什么用?-G_0,G_0。有?
我看不到第二个目标的用处,尤其是当尾递归优化(最后一次调用优化)为ON时。
当查询为资源贪婪且上述选项为OFF(例如,调试时)时,我可能会意识到GC问题(堆栈/堆溢出)。
我认为第二个调用是多余的(对于纯程序),应该由编译器消除。