验证矩阵是否在 ProLog 中减少

Verify if a matrix is reduced in ProLog

对于我最近关于我的矩阵运算项目的问题可能已经达到的那些,我实际上可以确认一切都在完美地工作......除了一个特定的操作。 我说的当然是一个函数来检查矩阵是否被简化为 Row Echelon Form,作为 functional/logic 编程的新手,这确实是我所面临的最困难的任务。

所以,对于这个函数我需要检查:

  1. 如果从左到右的对角线没有零;
  2. 如果下矩阵三角形全为零

这次我实际上是在寻求全面的帮助,因为我什至不知道如何开始制造这个烂摊子,真的希望有一个慷慨的灵魂来执行这个雄心勃勃的功能,并请解释她的思维方式和程序.

之前没有听说过 Row Echelon Form,我发现 https://stattrek.com/matrix-algebra/echelon-form.aspx 它告诉我 left-to-right 对角线上可以有零,只要每一行“开始”晚于前一行它。所以我在想:

  • 计算一行中有多少个前导零。

    • 手动递归研磨,如果列表的开头是零,则递增计数器,并向下递归剩余元素。如果开始不是零,则停止计数。
  • 在此基础上,如果该行中前导零的数量大于上一行中的矩阵,则矩阵为行梯形。我称之为棘轮,因为它只会增加。

    • 或者如果该行全为零。
    • 如果这个 ratchet/all 零对剩余的行有效。
% the number of leading zeros in a list [0,0,1,2,3] -> 2
row_leadZeroCount([],             LZC, LZC).
row_leadZeroCount([N|Ns], ZerosToHere, LZC) :-
    (N=0 -> (ZerosSeen is 1+ZerosToHere,
            row_leadZeroCount(Ns, ZerosSeen, LZC))
    ;       LZC = ZerosToHere).  % stop counting at the first non-zero.


% Nested lists are in Row Echelon Form if 
% the leading zeros in this row are more than the previous row
% or we're at a state of all remaining rows being only zeros.
matrix_ref_([], _, _).
matrix_ref_([Row|Rows], RowLen, Ratchet) :-
    row_leadZeroCount(Row, 0, RowZeros),
    (RowZeros < RowLen -> RowZeros > Ratchet
    ; RowZeros = RowLen),
    matrix_ref_(Rows, RowLen, RowZeros).


% wrapper to get row length, to see when a row is all zeros,
% and start the row length Ratchet going.
matrix_ref([Row|Rows]) :-
    length(Row, RowLen),
    matrix_ref_([Row|Rows], RowLen, -1).

例如

?- _Mx = [[1,2,3,4],    
          [0,0,1,3],
          [0,0,0,1],    %Example from linked web page
          [0,0,0,0]],
matrix_ref(_Mx).
true

注意。你说“减少到 Row Echelon Form”;我忽略了 link 中的“精简行梯队形式”,假设这不是您要的。