Как получить список значений во время пролога backtracking?

StackOverflow https://stackoverflow.com/questions/3939639

  •  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 Сбор решений» в Узнайте пролог сейчас!(К сожалению, это трудно напрямую ссылку на эти ресурсы.)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top