Пролог: игнорировать нежелательные переменные в выводе
Есть ли способ заставить 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
в запросах:
Смотрите также этот ответ о (анонимных) переменных в Прологе.