1

所以我得到的是一个包含矩阵坐标的列表。例如:

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。

4

1 回答 1

2

让我们关闭/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)

选择耦合到成员允许将 :Action 应用于每对坐标。操作它是 的证明closure(R_2, X0,X),即如果 X 可以从 X0 到达,使用谓词 R_2。

由于 isNeighbour/4[Hx, Hy]未绑定,我通过了整个坐标列表,并让 member/2 偷看一个坐标来测试...

于 2015-12-02T20:33:13.110 回答