Пролог: Возвращает список Y из фактов, где X = x

#prolog

Вопрос:

Я довольно новичок в Прологе и не могу разобраться в определенной проблеме. Допустим,у меня есть пара фактов факт(X, Y):
факт(a, m).
факт(b, m).
факт(c, n).
факт(x, q).
факт(x, y).
факт(x, z).

Я хотел бы создать список всех фактов Y с определенным X. Например:
?- getList(x, СПИСОК).
СПИСОК = [q,y,z].

q,y,z возвращаются, потому что они находятся в фактах, где X = x.

Есть ли быстрый способ сделать это? Я пытался использовать рекурсию для перебора всех фактов(x, Y) и добавления каждого Y, но я не смог заставить это работать.

Заранее благодарю вас!

Ответ №1:

Вы должны использовать findall/3, чтобы получить все решения для вашего запроса и собрать список с нужным шаблоном.

В вашем примере это должно быть:

 findall(Y, fact(x, Y), LIST).
 

Комментарии:

1. На самом деле, используйте setof/3 или bagof/3, которые должным образом не работают, если решения нет, тогда как findall выполняет «процедурные действия» и успешно справляется с пустым списком.

2. @DavidTonhofer: Я на самом деле верю, что ученику будет легче понять findall/3, а затем перейти к setof/3 или bagof/3, если это необходимо. Я также думаю, что он хочет пустой список, если вместо неудачи не будет найдено никакого решения.

3. Вы, ребята, серьезно зажигаете, спасибо вам! Не могу поверить, что я сам этого не нашел.