我的列表包含许多事实作为其元素。我想搜索一个数字是否是列表的成员。
这里我在程序中定义了边缘事实。现在我想检查节点1是否是列表的成员。
?-my([edge(1,2),edge(2,3),edge(1,4)],1,L).
false.
答案 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).