从图序言中获取节点

时间:2019-05-10 11:10:22

标签: prolog

我是Prolog的新手,我有这个问题。 由于这个事实需要从该节点列表中获取每个节点,我该怎么办?

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 :(得分:0)

这是一个完整的程序。请注意,我必须修正您对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].

答案 1 :(得分:0)

我向您展示了完成这项工作的两种方法: 第一种方法是“功能设计”,因为您可以使用节点列表中的每个元素

:- 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].

第二种方法是更多的“ prologish”, aggregate_all 扩展了 findall

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

PS您可以在{网站上找到库lambda 折叠 union aggregate_all 的详细信息{3}}