首页 > 解决方案 > 检查对角线是否相同

问题描述

我正在尝试编写一个谓词来删除外部检查是否对角线在序言中是相同的值(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”。任何人都可以告诉我是什么问题?

标签: prolog

解决方案


使用findall/3andnth1/3构建一个列表[X1, ..., Xn],其中Xi第 i 个列表的第 i 项在哪里M,并得到它的尾部D。然后,使用maplist/2,检查中D的所有项目是否相同X

same_diagonal(M) :-
    findall(X, (nth1(I,M,L), nth1(I,L,X)), [_|D]),
    maplist(=(X), D).


?- same_diagonal([[0,11,54,45],[16,1,6,9],[35,7,1,5],[27,3,9,1]]).
true.

?- same_diagonal([[0,11,54,45],[16,1,6,9],[35,7,1,5],[27,3,9,9999]]).
false.

推荐阅读