所以我得到的是一个包含矩阵坐标的列表。例如:
List 1: [[1, 1], [2, 1], [3, 1], [4, 1], [2, 2], [1, 3], [2, 3], [3, 3], [4, 3]]
List 2: [[1, 1], [2, 1], [3, 1], [4, 1], [1, 3], [2, 3], [3‚3], [4, 3]]
我需要弄清楚所有这些节点是否相互连接。也就是说,如果我选择任意节点,我可以到达任何其他节点。这对于List 1
是正确的,但不适用于List 2
,因为我无法从前4个节点中的任何节点到达最后4个节点中的任何节点。在List 1
中,节点[2, 2]
充当桥梁,因此它是真的。
我设法写了一个谓词,它将返回特定单元格的邻居,但我不知道如何继续。
编辑:这就是我现在所拥有的:
getXY([X, Y], X, Y).
findNeighbours(A, A, B, B).
findNeighbours(_, [], A, A).
findNeighbours(Cell, [Head|Tail],Temp, Neighbours):-
getXY(Cell, Cx, Cy),
getXY(Head, Hx, Hy),
isNeighbour(Cx, Cy, Hx, Hy),
append([Head], Temp, Merged),
findNeighbours(Cell, Tail, Merged, Neighbours), !.
findNeighbours(Cell, [Head|Tail],Temp, Neighbours):-
getXY(Cell, Cx, Cy),
getXY(Head, Hx, Hy),
not(isNeighbour(Cx, Cy, Hx, Hy)),
findNeighbours(Cell, Tail, Temp, Neighbours), !.
isNeighbour(Cx, Cy, Hx, Hy) :-
Cx = Hx, Cy is Hy + 1
; Cx = Hx, Cy is Hy - 1
; Cx is Hx + 1, Cy = Hy
; Cx is Hx - 1, Cy = Hy.
编辑2:您只能将1个单元格向左/向上/向右/向下移动。矩阵中的每个单元格具有X和Y坐标。在列表1中,我可以从任意节点到达任何节点,因为总有一个相邻节点。因此,通过到达我的意思是从节点A到节点B仅将X或Y递增1.
答案 0 :(得分:2)
让closure / 3工作
'all these nodes are connected'(L) :-
forall((select(S,L,R),member(T,R)), closure(connected(L),S,T)).
connected(L, [Cx, Cy], [Hx, Hy]) :-
member([Hx, Hy], L),
isNeighbour(Hx, Hy, Cx, Cy).
产量
?- 'all these nodes are connected'([[1, 1], [2, 1], [3, 1], [4, 1], [2, 2], [1, 3], [2, 3], [3, 3], [4, 3]]).
true.
?- 'all these nodes are connected'([[1, 1], [2, 1], [3, 1], [4, 1], [1, 3], [2, 3], [3, 3], [4, 3]]).
false.
一些解释:forall(:Cond,:Action)
对于Cond的所有替代绑定,可以证明Action。
我已将此加入视为:Cond
select(S,L,R),member(T,R)
与select耦合的 member允许对每对坐标应用:Action。动作它是closure(R_2, X0,X)
的证明,即如果X可以从X0到达,则使用谓词R_2。
由于isNeighbour / 4接收[Hx, Hy]
未绑定,我传递整个坐标列表,让member / 2查看坐标以进行测试......