Использование избыточных целей в запросах - PullRequest
12 голосов
/ 18 февраля 2020

(По предложению @ repeat ) Рассмотрим запрос программы pure 1 ?- G_0. Что использовать при запросе ?- G_0, G_0. есть?

Сноски
1 Таблицы отсутствуют (для безопасности), ограничения в порядке.
Предыдущий пост по теме.

Ответы [ 2 ]

3 голосов
/ 28 февраля 2020

Запрос ?- 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 голос
/ 25 февраля 2020

Рассмотрим запрос чистой программы1? - G_0. Какая польза от запроса? - G_0, G_0. Имеете?

Не вижу смысла во второй цели, особенно когда оптимизация хвостовой рекурсии ( оптимизация последнего вызова ) равна ON .

Я мог бы решить проблему G C (переполнение стека / кучи), когда запрос жадный до ресурсов, а параметры выше OFF (например, при отладке).

Я думаю, что второй вызов избыточен (для чистой программы) и должен быть исключен компилятором.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...