我正在尝试编写一个谓词以除去外部检查,对角线是否对角线是否在序言中具有相同的值(int) 例如:
same_Diagonal([[0,11,54,45],[16,1,6,9],[35,7,1,5],[27,3,9,1]])
是
[0,11,54,45]
[16,1,6,9]
[35,7,1,5]
[27,3,9,1]
首先,我们先去除外部,然后得到
[1,6,9]
[7,1,5]
[3,9,1]
并获取第一个列表的第一个元素的头,然后递归进行。
[1,5]
[9,1]
我已经成功移除了外部,因为当我键入
withoutHead([[0,11,54,45],[16,1,6,9],[35,7,1,5],[27,3,9,1]],X).
它可以成功显示
X = [[1, 6, 9], [7, 1, 5], [3, 9, 1]].
但是当比较对角线值时我失败了,这是我的代码
% withoutHead(+ ListOfList, -ListOfList)
% parameter1: the ListOfList is input
% parameter2: the ListOfList process output
withoutHead([HeadRow|TailRow],Squares):-
maplist(removeHead,TailRow,Squares).
% removeHead(+List, -List)
% parameter1: the List is each row
% parameter2: the List is tail of each row
removeHead([Head|Tail], Tail).
same_Diagonal([HeadRow|TailRow]):-
withoutHead([HeadRow|TailRow],[[Diagonal|Tail]|Back]),
same_Diagonal(Back).
,当我输入正确的输入时,我想返回“ true”,但它仍然给出“ false”。 谁能告诉我这是什么问题?
答案 0 :(得分:2)
谓词必须将左上角的值与所有其他对角线统一。
same_diagonal([],_).
same_diagonal([[UpperLeft|_]|NextRows], Diagonal) :-
Diagonal = UpperLeft,
without_head(NextRows, SquareMatrix),
same_diagonal(SquareMatrix, Diagonal).
或者,您可以定义diagonal
使其在矩阵的所有对角线上回溯:
diagonal([[UpperLeft|_]|_], UpperLeft).
diagonal([_ | NextRows], Diagonal) :-
without_head(NextRows, SquareMatrix),
diagonal(SquareMatrix, Diagonal).
[eclipse]: diagonal([[0, 11, 54, 45], [16, 1, 6, 9], [35, 7, 1, 5], [27, 3, 9, 1]], D).
D = 0
Yes (0.00s cpu, solution 1, maybe more) ? ;
D = 1
Yes (0.00s cpu, solution 2, maybe more) ? ;
D = 1
Yes (0.00s cpu, solution 3, maybe more) ? ;
D = 1
Yes (0.00s cpu, solution 4, maybe more) ? ;
No (0.00s cpu)
这可以与setof/3
结合使用,后者会修剪重复的结果,并使用setof(D,diagonal(..., D),[_])
来检查所有对角线是否相同。
答案 1 :(得分:2)
使用findall/3
和nth1/3
,建立一个列表[X1, ..., Xn]
,其中Xi
是M
中第i个列表的第i个项目,并得到尾巴D
。然后,使用maplist/2
检查D
中的所有项目是否都与{{1}}相同。
X
答案 2 :(得分:1)
在这里将程序分成两个谓词可能会很有用:
diag/2
生成给定列表的对角线;和are_same/1
检查值是否全部相同。优点是我们以后可以重用两个谓词以用于不同的应用程序。
我们可以如下实现diag/2
:
diag(M, D) :-
diag(M, 0, D).
diag([], _, []).
diag([R|Rs], I, D) :-
( nth0(I, R, X)
-> D = [X|Ds],
I1 is I+1,
diag(RS, I1, Ds)
; D = []
).
这也适用于非平方矩阵。
are_same/1
可以实现为:
are_same([]).
are_same([H|T]) :-
maplist(==(H), T).
所以现在我们可以将它们组合为:
same_diag(M) :-
diag(M, D),
are_same(D).
因此,以上内容适用于“ 0×0矩阵”和非平方矩阵。