Как получить список значений во время пролога backtracking?
-
30-09-2019 - |
Вопрос
Скажем, у меня есть следующий кусок кода:
edge(a, b).
edge(a, c).
edge(a, d).
Теперь, когда я делаю
neighbors(V, N) :- edge(V, N), writeln(N), fail.
Я могу получить список соседей, напечатанных на консоль. Но как я могу получить его в качестве списка результатов? Что-то типа
neighbors(V, Vs) :-
edge(V, N),
not(member(N, Vs)),
neighbors(V, [N|Vs]).
(вышеупомянутый кусок на самом деле не работает из-за способа member
обрабатывается. Любое предложение, пожалуйста?
Решение
Вы можете использовать bagof/3
Чтобы создать список ваших вершин, которые удовлетворяют цели, «VS - это все крайние значения V».
neighbors(V, Vs) :- bagof(N, edge(V, N), Vs).
neighbors(a, Vs). % Vs = [b, c, d].
Другие советы
Читать о findall
, bagof
а также setof
В вашем любимом руководстве реализации пробелов или, например, в разделе «11.2 Сбор решений» в Узнайте пролог сейчас!(К сожалению, это трудно напрямую ссылку на эти ресурсы.)
Не связан с StackOverflow