(По предложению @repeat ) Рассмотрим запрос чистой программы 1 ?- G_0.
Какой смысл в этом запросе ?- G_0, G_0.
?
Сноски
1 Таблицы отсутствуют (для безопасности), ограничения в порядке.
Предыдущий пост на эту тему.
prolog
logical-purity
ложный
источник
источник
?- G_0(State), G_0(State).
Также в стеке не передается состояние от результата первой цели до второй цели?G_0
может быть любая (чистая) цель, в том числе, скажемG_0 = append(Xs,Ys,Zs)
G_0;G_0
Можно проверить побочные эффекты или проблемы с производительностью / кэшированием / табулированием)G_0(State),G_0(State)
одного, скорее пишетcall(G_1,State), call(G_1,State)
Ответы:
Запрос
?- G_0, G_0.
помогает определить избыточные ответы?- G_0.
Для этого достаточно сравнить количество ответов
?- G_0.
с количеством ответов?- G_0, G_0.
. Нет необходимости хранить эти ответы (что часто является источником ошибок). Достаточно двух целых чисел! Если они равны, то нет избыточности. Но если?- G_0, G_0.
есть больше ответов, то есть некоторая избыточность. Вот пример:... а теперь давайте исправим это:
Нет необходимости вручную проверять связанные ограничения.
Это может быть расширено, когда мы явно ищем только избыточные ответы, используя
call_nth/2
.источник
Я не вижу никакой пользы второй цели, особенно при оптимизации хвостовой рекурсии ( последняя оптимизация вызовов ) является ON .
Я мог бы понять проблему GC (переполнение стека / кучи), когда запрос жадный к ресурсам, а вышеуказанные опции отключены (например, при отладке).
Я думаю, что второй вызов является избыточным (для чистой программы) и должен быть исключен компилятором.
источник