Как получить список значений при возврате Пролога? - PullRequest
0 голосов
/ 15 октября 2010

Скажите, у меня есть следующий фрагмент кода:

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. Любое предложение, пожалуйста?

Ответы [ 2 ]

3 голосов
/ 15 октября 2010

Прочтите о findall, bagof и setof в вашем любимом руководстве по реализации Пролога или, например, раздел «11.2 Сбор решений» в Изучите Пролог сейчас! (К сожалению, сложно напрямую ссылаться на эти ресурсы.)

1 голос
/ 15 октября 2010

Вы можете использовать bagof/3, чтобы создать список ваших вершин, которые удовлетворяют цели: «Vs - это все N, являющееся ребром V».

neighbors(V, Vs) :- bagof(N, edge(V, N), Vs).

neighbors(a, Vs). % Vs = [b, c, d].
...