Получение узла из пролога графа - PullRequest
1 голос
/ 10 мая 2019

Я новичок в Прологе, у меня есть этот вопрос. Из этого факта нужно получить каждый узел из этого списка узлов, как я могу это сделать?

nodelist([[a,[2,3],[b,d]],[b,[5,1],[a,c,d]],[c,[3,2],[b,d]]).

where nodelist([[node,[coordinate_node],[neighbours]]])

Я пробовал

node(Nodelist,Node):- nodelist(Nodelist), findall(Node,Nodelist(Nodes),Nodes).

ожидается оператор синтаксической ошибки

Ответы [ 2 ]

0 голосов
/ 10 мая 2019

Я покажу вам два способа сделать эту работу: Первый способ - «функциональное проектирование», потому что вы работаете с каждым элементом списка узлов

:- use_module(library(lambda)).
nodelist([[a,[2,3],[b,d]],[b,[5,1],[a,c,d]],[c,[3,2],[b,d]]]).

fetch_nodes(In, Out) :-
    foldl(\X^Y^Z^(X = [_, _, Nodes], union(Y,Nodes, Z)), In, [], Out).

пример

?- nodelist(L), fetch_nodes(L, Nodes).
L = [[a, [2, 3], [b, d]], [b, [5, 1], [a, c, d]], [c, [3, 2], [b, d]]],
Nodes = [a, c, b, d].

Второй способ более "прологичен", aggregate_all extends findall :

nodes(Nodelist,Nodes):-
   aggregate_all(set(Node), (member([_, _, L], Nodelist), member(Node, L)),Nodes).

PS Подробную информацию о библиотеке лямбда , foldl , union и aggregate_all можно найти на сайте SWI- Пролог

0 голосов
/ 10 мая 2019

Вот полная программа. Обратите внимание, что мне пришлось исправить ваше определение nodelist/1.

nodelist([[a,[2,3],[b,d]],[b,[5,1],[a,c,d]],[c,[3,2],[b,d]]]).

node(X) :-
    nodelist(L),
    member([X,_,_], L).

nodes(Xs) :-
    nodelist(L),
    nodes(L, Xs).

nodes([], []).
nodes([[X,_,_]|L], [X|Xs]) :-
    nodes(L, Xs).

и сейчас:

?- node(X).
X = a ;
X = b ;
X = c.

?- nodes(Xs).
Xs = [a, b, c].
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...