Правильный способ:
findall(person(Person),person(Person),ListOfPeople).
or
bagof(person(Person),person(Person),ListOfPeople).
Почему ваш подход не работает? Рассмотреть возможность
findall(Person,is_person(Person),ListOfPeople).
Пролог пытается выполнить is_person(Person)
.
Есть факт is_person(person(_)).
Итак, для Person = person(_)
мы хороши! Так что person(_)
будет в списке.
И все, других способов вывести is_person(Person)
нет.
Чтобы собрать все Person
, нам действительно нужно запросить Person
, который соответствует person(Person)
.
Таким образом:
findall(person(Person),person(Person),ListOfPeople).
Пролог найдет три Person
, которые выполняют person(Person)
. Поскольку в результате должен получиться список не из Person
, а из person(Person)
, мы ставим person/1
вокруг Person
в 1-м параметре, шаблоне.
В качестве альтернативы (но немного бессмысленно) вы могли бы:
is_person(person(X)) :- person(X).
?- findall(X,is_person(X),ListOfPeople).
Здесь Пролог собирает все X
, для которых is_person(person(X))
, которые являются всеми X
, которые появляются в (факте) person(X)
. Таким образом, X
это, например, fred
. Мы шлепаем person/1
вокруг fred
по голове is_person/1
. Сделанный.
person
David Tonhofer
schedule
02.12.2020