如何在Prolog中使用基础谓词实现上三角矩阵识别
Prolog上三角矩阵识别实现方案
核心判定规则
上三角矩阵需要同时满足两个条件:
- 是方阵:行数等于每一行的元素个数
- 第k行(行索引从0开始计数)的前k个元素全部为0
实现代码
% 主谓词:判断输入矩阵是否为上三角矩阵 is_upper_triangular(Matrix) :- % 获取矩阵行数 length(Matrix, N), % 验证所有行长度等于N,确认是方阵 check_square(Matrix, N), % 从第0行开始逐行校验规则 check_rows(Matrix, 0). % 辅助谓词:检查是否为方阵 check_square([], _). check_square([Row|Rest], N) :- length(Row, N), check_square(Rest, N). % 辅助谓词:逐行检查前导0规则 check_rows([], _). check_rows([Row|RestRows], CurrentIndex) :- all_zero_prefix(Row, CurrentIndex), NextIndex is CurrentIndex + 1, check_rows(RestRows, NextIndex). % 辅助谓词:检查列表前N个元素全为0 all_zero_prefix(_, 0). all_zero_prefix([0|RestList], N) :- N > 0, Remain is N - 1, all_zero_prefix(RestList, Remain).
测试用例参考
你可以直接用以下案例验证代码正确性:
- 空矩阵查询:
is_upper_triangular([]).返回true - 1阶矩阵查询:
is_upper_triangular([[9]]).返回true - 合法3阶上三角矩阵查询:
is_upper_triangular([[1,2,3],[0,4,5],[0,0,6]]).返回true - 非法矩阵查询:
is_upper_triangular([[1,2],[3,4]]).返回false - 非方阵查询:
is_upper_triangular([[1,2],[0]]).返回false
关键点说明
你之前遇到的元素访问问题,本实现通过递归逐行匹配+前缀长度控制的方式解决:不需要手动指定下标取元素,利用Prolog列表的头匹配特性,直接验证前导元素是否为0,完全使用要求范围内的基础谓词实现,没有引入额外自定义高阶谓词。
内容的提问来源于stack exchange,提问作者john_ny
相关产品推荐
相关产品推荐

