确定在Prolog中节点是否以矩阵连接

问题描述:

所以我得到的是一个包含矩阵坐标的列表。例如:确定在Prolog中节点是否以矩阵连接

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

你能告诉你的代码? – vmg

+0

@vmg,当然。这可能过于复杂(对于序言来说有点新鲜)。我会马上编辑主要帖子。 – Zahand

+0

请定义*覆盖*。能够从另一个节点到达哪一个节点意味着什么? – lurker

,让我们把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(:电导率,:动作)

对于电导率的所有替代绑定,行动可以证明。

我已经把这个连接为:电导率

select(S,L,R),member(T,R) 

select耦合到member允许申请:动作每对坐标。动作这是一个closure(R_2, X0,X)的证明,即如果X可以从X0到达,则使用谓词R_2。

由于isNeighbour/4接收[Hx, Hy]未绑定的,我通过整个坐标列表,并让会员/ 2偷看坐标测试...