fal*_*lse 15 prolog logical-purity
(根据@repeat的建议)考虑一个纯程序的查询1 ?- G_0.如果有的话,这个查询?- G_0, G_0.有什么用?
该查询?- 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
Run Code Online (Sandbox Code Playgroud)
......现在让我们解决这个问题:
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
Run Code Online (Sandbox Code Playgroud)
无需手动检查所涉及的约束。
当我们仅使用 明确搜索冗余答案时,这可以进一步扩展call_nth/2。
?- G_0, call_nth(G_0, 2).
Run Code Online (Sandbox Code Playgroud)