1

我有以下图表:

图形

我的目标是获取某个节点的所有直接连接以及未与某个节点连接的所有节点,例如:

连接(1,X)。

X=3;

X=4;

X=5;

X=6。

无连接(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进行连接

4

2 回答 2

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 .
于 2018-02-06T08:31:07.617 回答
0

您可以使用not(Goal)谓词。你可以说not(path(X,Y)); not(path(Y,X)).这只是你目标的倒置。如果节点直接连接到您正在检查的任何节点,则结果为 false。没有连接返回true。

于 2018-02-06T09:59:12.210 回答