【问题标题】:Prolog find non related graph nodesProlog查找不相关的图节点
【发布时间】:2018-02-06 04:01:12
【问题描述】:

我有以下图表:

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

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

如您所见,我成功完成了 connections,但不知道如何为 noConnections

【问题讨论】:

    标签: prolog graph-theory transitive-closure


    【解决方案1】:

    一种方式:

    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 .
    

    【讨论】:

    • 是的,有一个错字是 collectAllNodesButX(X,L)。我更正了我的代码,对不起!
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-10-12
      • 1970-01-01
      • 1970-01-01
      • 2019-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多