我有以下图表:
我的目标是获取某个节点和所有未与某个节点连接的节点的所有直接连接,例如:
连接(1,X)。
X = 3;
X = 4;
X = 5;
X = 6。
noConnections(1,X)。
X = 2。
这是我的代码:
% knowledge base
path(1, 6).
path(1, 5).
path(1, 4).
path(1, 3).
path(6, 5).
path(5, 4).
path(4, 2).
path(2, 3).
% rules
connections(X,Y) :- path(X,Y) ; path(Y,X).
noConnections(X,Y) :- \+path(X,Y).
正如您所看到的,我成功地完成了连接,但无法找到如何为 noConnections
做到这一点答案 0 :(得分:2)
一种方式:
connected(X, Y) :-
path(X,Y);path(Y,X).
% fetching all nodes of the database
collectAllNodesButX(X, L) :-
setof(A, B^(path(A,B);path(B,A)), L1),
select(X, L1, L).
% main predicate
notConnected(X, L) :-
collectAllNodesButX(X,Nodes),
% we exclude all nodes that succeed the predicate connected/2
findall(Y, (member(Y, Nodes), \+connected(X, Y)), L).
现在,我们得到:
?- notConnected(1, L).
L = [2] .
?- notConnected(X, [2]).
X = 1 .
答案 1 :(得分:0)
您可以使用not(Goal)
谓词。您可以说not(path(X,Y)); not(path(Y,X)).
这只是您目标的反转。如果节点直接连接到您要检查的任何节点,则结果为false。那时没有连接返回。