You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 20:45:03