Пролог. В запросе, как поставить условие на переменную, которую я не хочу в результатах?
Представьте себе, что у меня есть следующая база знаний, которая дает каждому человеку его имя и возраст.
person(mary, 39).
person(john, 24).
person(sandy, 17).
Теперь я хочу восстановить всех людей старше 20 лет. Кроме того, я просто хочу собрать их имена, а не их возраст. Здесь я хочу получить mary
а также john
,
Как это сделать в основном в Прологе, а точнее в SWI-Прологе?
Если мы используем переменную, которая не является анонимной, например:
?- person(X, Y), Y > 20.
Пролог даст мне значения для обоих X
а также Y
а я не хочу Y
,
Я не могу использовать анонимную переменную _
потому что Пролог не может связать свои два экземпляра. Следующее дает ошибку:
?- person(X, _), _ > 20.
Итак, как это сделать?
3 ответа
Почему бы вам не определить предикат
ofintrest(X):- person(X,Y),Y>20.
запрос
ofintrest(X).
Если вы не хотите определять предикат, вы также можете использовать двойное отрицание
person(X,_) ,\+(\+ (person(X,Y), Y>20))
Этот ответ непосредственно следует за предыдущим ответом @danielp.
С прологом- верхним уровнем swi-пролога вы можете иметь любой из них:
показать подстановки ответов всех переменных (по умолчанию)
не показывать замены ответов для таких переменных, как
_A
Для получения подробной информации прочитайте руководство по использованию процессора Prolog!
Для SWI: Контроль среды (флаги Пролога). current_prolog_flag/2
, set_prolog_flag/2
,
stefan@Lenovo ~ $ swipl Добро пожаловать в SWI-Prolog (многопоточный, 64 бита, версия 7.3.15) ...? - current_prolog_flag ( toplevel_print_anon, Flag) . % get по умолчанию Flag = true.?- _A = 1. _A = 1.?- _A = 1, X = _A. _A = X, X = 1.? - set_prolog_flag ( toplevel_print_anon, false) . % флаг переключения true.?- current_prolog_flag(toplevel_print_anon, Flag). Флаг = ложь.?- _A = 1. % Осторожно! правда.?- _A = 1, X = _A. X = 1.?- set_prolog_flag(toplevel_print_anon, true). % restore flag true.?- current_prolog_flag(toplevel_print_anon, Flag). Флаг = правда.?- _A = 1. _A = 1.?- _A = 1, X = _A. _A = X, X = 1.
Вы можете определить предикат как уже опубликованный в ответе CAFEBABE. Кроме того, вы также можете дать имя, которое начинается с _
переменным, значения которых не должны появляться в ответе (как вы уже отметили, _
всегда разные переменные):
person(X,_Age), _Age > 20.
Обновление: это специфично для реализации Пролога. Это работает для SICStus, но не для SWI по умолчанию (см . Ответ повторения).