Запрос ?- 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).