序言|如果3x4矩阵中的两个元素是对角线,则返回true

时间:2019-07-14 09:57:43

标签: matrix prolog swi-prolog diagonal

我才刚刚开始学习序言。我有一个问题,对象是3x4矩阵中的插槽

a b c d 
e f g h
i j k l

每个元素都是一个插槽

Slot(Name,leftNeighbor,UpperNeighbor, RightNeighbor,LowerNeighbor).

我需要创建一个名为diagonal(Name1,Name2)的查询,如果两个插槽是对角线,则返回true(例如:a,f,k是对角线,d,j,g也是)。

我正在考虑检查每个元素,如果他的左/右邻居的下邻居是Name2,或者该元素自己的左/右邻居的下邻居是Name2。有没有更简单的方法来找到这个?对我来说太长了,效率低下。

这些是我目前的规则 〜

slot(name,LeftNeighbor,UpperNeighbor,RightNeighbor,LowerNeighbor).
slot(a,none,none,b,e).
slot(b,a,none,c,f).
slot(c,b,none,d,g).
slot(d,c,none,none,h).
slot(e,none,a,f,i).
slot(f,e,b,g,j).
slot(g,f,c,h,k).
slot(h,g,d,none,l).
slot(i,none,e,j,none).
slot(j,i,f,k,none).
slot(k,j,g,l,none).
slot(l,k,h,none,none).

谢谢。

1 个答案:

答案 0 :(得分:0)

几天前解决了这个问题。

这是所有可能需要的解决方案:

diag_1(Name1,Name2) :- slot(Name1,_,_,A,_), A \= none, slot(Name2,_,A,_,_). 
diag_1(Name1,Name2) :- slot(Name1,_,_,A,_), A \= none, slot(Name2,_,B,_,_), B \= none, diag_1(A,B).

diag_2(Name1,Name2) :- slot(Name1,_,_,_,A), A \= none, slot(Name2,_,_,A,_). %same on the other diagonal
diag_2(Name1,Name2) :- slot(Name1,_,_,_,A), A \= none, slot(Name2,_,_,B,_), B \= none, diag_2(A,B).

diagonal(Name1,Name2) :- diag_1(Name1,Name2) ; diag_1(Name2,Name1) ; diag_2(Name1,Name2) ; diag_2(Name2,Name1). 
相关问题