Использование избыточных целей в запросах


12

(По предложению @repeat ) Рассмотрим запрос чистой программы 1 ?- G_0. Какой смысл в этом запросе ?- G_0, G_0.?

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


Квадрат числа результатов?
Виллем Ван Онсем

1
Я полагаю, что информация о состоянии не сохраняется от последовательного выполнения цели. Другими словами, изменение вопроса не допускается, например. ?- G_0(State), G_0(State).Также в стеке не передается состояние от результата первой цели до второй цели?
Гай Кодер

1
G_0может быть любая (чистая) цель, в том числе, скажемG_0 = append(Xs,Ys,Zs)
ложная

1
@GuyCoder: требуется соединение. ( G_0;G_0Можно проверить побочные эффекты или проблемы с производительностью / кэшированием / табулированием)
false

1
Кстати, вместо G_0(State),G_0(State)одного, скорее пишетcall(G_1,State), call(G_1,State)
ложь

Ответы:


3

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

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

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.