代码之家  ›  专栏  ›  技术社区  ›  I'm not human

Prolog查找不相关的图形节点

  •  1
  • I'm not human  · 技术社区  · 8 年前

    我有以下图表:

    GRAPH

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

    连接(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).
    

    正如你所看到的,我成功地做到了 连接 但我不知道该怎么做 无连接

    2 回复  |  直到 6 年前
        1
  •  2
  •   joel76    8 年前

    单向:

    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 .
    
        2
  •  0
  •   G_V    8 年前

    您可以使用 not(Goal) 谓语你可以说 not(path(X,Y)); not(path(Y,X)). 这只是你的目标的颠倒。如果节点直接连接到要检查的节点,则结果为false。然后,无连接返回true。