Пролог. В запросе, как поставить условие на переменную, которую я не хочу в результатах?

Представьте себе, что у меня есть следующая база знаний, которая дает каждому человеку его имя и возраст.

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 по умолчанию (см . Ответ повторения).

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