从边列表中获取顶点

时间:2017-10-26 17:38:37

标签: list prolog graph-theory

我的列表包含许多事实作为其元素。我想搜索一个数字是否是列表的成员。

这里我在程序中定义了边缘事实。现在我想检查节点1是否是列表的成员。

?-my([edge(1,2),edge(2,3),edge(1,4)],1,L).
false.

3 个答案:

答案 0 :(得分:2)

一个简单的双线谓词:

has_node(UV,L) :-
    member(edge(U,V), L),
    (UV = U; UV = V).

或者使用两个member/2谓词:

has_node(UV,L) :-
    member(edge(U,V), L),
    member(UV, [U,V]).

然后我们可以在多个方向查询它:

?- has_node(N, [edge(1,2),edge(2,3),edge(1,4)]).
N = 1 ;
N = 2 ;
N = 2 ;
N = 3 ;
N = 1 ;
N = 4.

?- has_node(2, [edge(1,2),edge(2,3),edge(1,4)]).
true ;
true ;
false.

?- has_node(2,L).
L = [edge(2, _G1245)|_G1248] ;
L = [edge(_G1244, 2)|_G1248] ;
L = [_G1247, edge(2, _G1245)|_G1251] ;
L = [_G1247, edge(_G1244, 2)|_G1251] ;
L = [_G1247, _G1250, edge(2, _G1245)|_G1254] ;
L = [_G1247, _G1250, edge(_G1244, 2)|_G1254] ;
L = [_G1247, _G1250, _G1253, edge(2, _G1245)|_G1257] .

?- has_node(A,L).
L = [edge(A, _G1257)|_G1260] ;
L = [edge(_G1256, A)|_G1260] ;
L = [_G1259, edge(A, _G1257)|_G1263] ;
L = [_G1259, edge(_G1256, A)|_G1263] ;
L = [_G1259, _G1262, edge(A, _G1257)|_G1266] ;
L = [_G1259, _G1262, edge(_G1256, A)|_G1266] .

答案 1 :(得分:1)

您必须知道列表中的事实类型。

假设事实采用 edge(u,v)的形式,那么以下非常天真的谓词应该这样做:

node_exists(Node, [edge(U,_V)|_]) :-
   U =:= Node,
   !.
node_exists(Node, [edge(_U,V)|_]) :-
   V =:= Node,
   !.
node_exists(Node, [_|R1]) :-
   node_exists(Node, R1).

示例查询:

?- node_exists(3, [edge(1,2),edge(2,3),edge(1,4)]).
true.

?- node_exists(2, [edge(1,2),edge(2,3),edge(1,4)]).
true.

?- node_exists(6, [edge(1,2),edge(2,3),edge(1,4)]).
false.

答案 2 :(得分:-1)

递归是Prolog的强大功能,在学习Prolog时你无法忽略它。

顺便说一下,这是一个解决方案,它可以查找列表中存在节点的次数。

lits([H|_],E) :-
   element(H,E).    
lits([_H|T],E) :-
   lits(T,E).   

element(edge(A,_B),A).