我想检测非导向图中的循环并返回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).