Пролог: игнорировать нежелательные переменные в выводе

Есть ли способ заставить CLI пролога возвращать результаты запроса только с интересующими меня переменными? Простой пример будет:

?- mother(M, C1), father(F, C1).

который возвращает привязки для всех M, F а также C1, Но меня интересует только M а также F, в то время как C1 это просто беспорядок. В этом простом примере это неплохо, но для более длинных запросов со многими вспомогательными переменными это намного неприятнее.

Есть ли простой способ выразить это с помощью запроса; Я имею в виду, не определяя отдельное правило?

Ура, Яцек

3 ответа

Решение

Очень простой способ сделать это - использовать library(lambda) Ульрих Ноймеркель.

Например, в вашем случае приведены примеры фактов:

Mother_child(м, ц).
папа-ребенок (ж, з).

Мы получаем по вашему запросу:

? - mother_child(M, C),
   папа-ребенок (F, C).
М = м,
C = C,
F = f.

Мы хотели бы спроецировать переменную C,

Таким образом, мы заключаем весь запрос в лямбда- выражение так, чтобы только M а также F имеют глобальный охват и, следовательно, сообщаются на верхнем уровне:

? - M ^ F + \ (мать-ребенок (M, C),
         Father_child (F, C)).
М = м,
F = f.

Это становится тем полезнее, чем больше переменных вы хотите спроецировать. Вам нужно только указать переменные, о которых вы хотите, чтобы верхний уровень сообщал.

В случае SWI-Prolog он предлагает флаг, чтобы скрыть переменные, которые начинаются с подчеркивания. Для изменения настроек выполните цель

set_prolog_flag(toplevel_print_anon, false).

в сессии SWI-Пролог. Кроме того, вы можете добавить его в свой .swiplrc,

Более подробный ответ с примерами приведен по адресу /questions/19845177/prolog-v-zaprose-kak-postavit-uslovie-na-peremennuyu-kotoruyu-ya-ne-hochu-v-rezultatah/19845180#19845180.

В SWI-Prolog библиотека ( yall) предлагает функциональность, которая вам нужна, и многое другое.

?- {M,F}/(mother_child(M, C),father_child(F, C)).
M = m,
F = f.

Может быть, было бы достаточно использовать "синтаксис вспомогательной переменной" с _ для этих ваших вспомогательных переменных?

Обратите внимание на разницу между использованием C а также _C в запросах: SWHISH интерфейс

Смотрите также этот ответ о (анонимных) переменных в Прологе.

Другие вопросы по тегам