Prolog检查非有向图中的循环

时间:2018-05-18 19:54:25

标签: graph prolog cycle

我想检测非导向图中的循环并返回true或false。 我的节点是桌子上的一对(X,Y)坐标。

我有一个在井字游戏网格上玩的游戏。 谓词量子(pos(X,Y),pos(Z,T),Color)类似于我网格上的一块。它可以放在我的3x3桌子上的两个单元格上。我可以将两个量子位置从不同的部分放入同一个单元格中,有时它们可​​以形成一个循环,我想检测它。

由于我的节点是单元格(X,Y坐标的元组),我的量子块就像两个节点之间的边缘。我想从状态中获取所有量子片并形成由第一个findall制作的单元对的列表(DirectedEdges)。我的图是无向的,所以我制作了ReverseEdges并将它们组合起来得到我的无方向边列表。

我的循环功能不适用于我的无向图,我不明白为什么。 我不认为我需要添加那么多的背景来问我的问题。

循环的参数是:Node是起始点(第一个参数),Next是遍历Graph(第二个参数),Visited是访问节点列表(第三个参数),Edges是包含所有节点的列表我的图形的边缘(第四个参数)。

编辑:国家是我的董事会成员名单,它可以有更多的碎片或更少的碎片。

状态= [量子(pos(1,1),pos(3,1),白色),量子(pos(1,2),pos(3,2),黑色),量子(pos(1, 1),pos(3,2),white)]

状态= [量子(pos(1,1),pos(3,1),白色),量子(pos(1,2),pos(3,2),黑色),量子(pos(1, 1),pos(3,2),白色),量子(pos(1,2),pos(3,1),黑色)]。

对于第一个状态,我希望has_cycle(State)返回false,因为它没有循环,而对于第二个状态则为true。颜色不会干扰循环。

    cycle(Node, Node, _, _) :- !, true.
    cycle(_, Node, Visited, _) :- member(Node, Visited), !, fail.
    cycle(Node, Next, Visited, Edges) :- member((Next, NextNext), Edges), cycle(Node, NextNext, [Next|Visited], Edges). 

has_cycle(State) :-
    findall((pos(X, Y), pos(Z, T)), member(quantum(pos(X, Y), pos(Z, T), _), State), DirectedEdges),
    findall((pos(X, Y), pos(Z, T)), member((pos(Z, T), pos(X, Y)), DirectedEdges), ReverseEdges),
    append(DirectedEdges, ReverseEdges, Edges),
    member((Node, Next), Edges),
    cycle(Node, Next, [Next], Edges).

0 个答案:

没有答案