序言 | Return 如果 3x4 矩阵中的两个元素是对角线则为真
Prolog | Return true if two elements in a 3x4 matrix are diagonal
我刚开始学习序言。我有一个问题,对象是 3x4 矩阵中的一个槽
a b c d
e f g h
i j k l
每个元素都是一个插槽
Slot(Name,leftNeighbor,UpperNeighbor, RightNeighbor,LowerNeighbor).
我需要创建一个名为 diagonal(Name1,Name2)
的查询,如果两个插槽是对角线,则 returns 为真(例如:a,f,k
是对角线,d,j,g
也是)。
我正在考虑检查每个元素,如果他的 left/right 邻居的下邻居是 Name2,或者该元素自己的 left/right 邻居的下邻居是否是 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).
谢谢。
几天前就解决了。
这里是所有可能需要它的人的解决方案:
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).
我刚开始学习序言。我有一个问题,对象是 3x4 矩阵中的一个槽
a b c d
e f g h
i j k l
每个元素都是一个插槽
Slot(Name,leftNeighbor,UpperNeighbor, RightNeighbor,LowerNeighbor).
我需要创建一个名为 diagonal(Name1,Name2)
的查询,如果两个插槽是对角线,则 returns 为真(例如:a,f,k
是对角线,d,j,g
也是)。
我正在考虑检查每个元素,如果他的 left/right 邻居的下邻居是 Name2,或者该元素自己的 left/right 邻居的下邻居是否是 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).
谢谢。
几天前就解决了。
这里是所有可能需要它的人的解决方案:
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).