#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. Вы, ребята, серьезно зажигаете, спасибо вам! Не могу поверить, что я сам этого не нашел.