prolog - 检查对角线是否相同
问题描述
我正在尝试编写一个谓词来删除外部检查是否对角线在序言中是相同的值(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”。任何人都可以告诉我是什么问题?
解决方案
使用findall/3
andnth1/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.
推荐阅读
- python - 在 try/catch 块中重新排列声明
- amazon-web-services - 无法创建/终止实例(我是管理员)
- accessibility-insights - FastPass 辅助功能模式更新
- qgis - QGIS如何计算Uber h3_9细胞的面积
- excel - 具有多个条件和通配符的 SUMPRODUCT
- python - 如果命令已经具有错误功能,如何不从其他文件引发错误?
- fonts - 如果我为我们的 Web 应用禁用 webkit-font-smoothing,它对 Windows 用户来说会看起来很糟糕吗?
- node.js - 节点子进程未同时执行
- android - 如何使用 Kotlin 使用 LiveData 和 Room Android 测试 ViewModel?
- mysql - 创建 mysql 存储过程给出语法错误