Використання зайвих цілей у запитах


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одного можна перевірити побічні ефекти або проблеми з продуктивністю / кешуванням / маркуванням)
помилково

1
BTW, а не 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. є?

Я не бачу корисності другої мети, особливо коли оптимізація хвостової рекурсії ( оптимізація останнього дзвінка ) ВКЛ .

Я міг би зрозуміти проблему GC (переповнення стека / купи), коли запит є жадібним до ресурсів, а вищевикладені параметри вимкнено (наприклад, при налагодженні).

Я думаю, що другий виклик є зайвим (для чистої програми) і його слід усунути компілятором.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.