Matrix Prolog如何求元素和矩阵

Matrix Prolog如何求元素和矩阵,matrix,prolog,sum,find,Matrix,Prolog,Sum,Find,我有矩阵大小[n,n] 我需要找一个总数 比如说 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 sum = 3+4+7+8 我需要找到第一象限矩阵的元素之和%-矩阵 %-matrix data([[1,2,18,23], [5,6,10,10], [9,10,11,12], [13,14,15,16]]). %-Sum main(S):- data(Ms), length(Ms,N)

我有矩阵大小
[n,n]

我需要找一个总数 比如说

1  2  3  4 
5  6  7  8 
9  10 11 12
13 14 15 16

sum = 3+4+7+8
我需要找到第一象限矩阵的元素之和

%-矩阵
    %-matrix
data([[1,2,18,23],
      [5,6,10,10],
      [9,10,11,12],
      [13,14,15,16]]).
%-Sum
main(S):-
    data(Ms),
    length(Ms,N),
    Mdl is N//2,
    sum_matr(Ms,1,N,Mdl,0,S).

%+Matrix,+RowCounter,+Length,+Midle,+Acc,-S
sum_matr([R|Rs],I,K,Mdl,Acc,S):-
    I=<Mdl, I1 is I+1,
    findEnd(R,Mdl,ResList),
    sum_row(ResList,Mdl,I,K,0,Srow),
    Acc1 is Acc + Srow,
    sum_matr(Rs,I1,K,Mdl,Acc1,S).

sum_matr(_,I,_,Mdl,S,S):-
    I>Mdl.

%+Row,+Counter,+I,+K,+Acc,-Sum
sum_row([X|Xs],C,I,K,Acc,S):-
    C<K,
    Acc1 is Acc+X,
    C1 is C+1,
    sum_row(Xs,C1,I,K,Acc1,S).
sum_row(_,C,_,K,S,S):-
    C>=K.
%+List, +Position, -End
findEnd(E, 0, E).
findEnd([_|T], N, E):-
    N>0,
    N1 is N-1,
    findEnd(T, N1, E).
数据([[1,2,18,23], [5,6,10,10], [9,10,11,12], [13,14,15,16]]). %-总数 主要工程:- 数据(毫秒), 长度(Ms,N), Mdl是N//2, 总和(Ms,1,N,Mdl,0,S)。 %+矩阵,+行计数器,+长度,+Midle,+Acc,-S 总和([R|Rs]、I、K、Mdl、Acc、S):- I=Mdl。 %+行,+计数器,+I,+K,+Acc,-和 求和行([X | Xs],C,I,K,Acc,S):- C=K。 %+列表,+位置,-结束 findEnd(E,0,E)。 发现([u124; T],N,E):- N> 0,, N1是N-1, findEnd(T,N1,E)。
使用
库(clpfd)
,该库提供有用的
求和/3
转置/2

:- use_module(library(clpfd)).

sum_first_quadrant(M, S) :-
    first_quadrant(M, Q),
    maplist(sum_, Q, Ss),
    sum_(Ss, S).

sum_(L, S) :-
    sum(L, #=, S).

first_quadrant(M, Q) :-
    transpose(M, T),
    reverse(T, RT),
    dichotomize(RT, RD),
    reverse(RD, D),
    transpose(D, TD),
    dichotomize(TD, Q).

dichotomize(M, D) :-
    length(M, L),
    X #= L//2,
    dichotomize_(M, X, D).

dichotomize_(_, 0, []).
dichotomize_([H|T], X, [H|T2]) :-
    X #> 0,
    Y #= X - 1,
    dichotomize_(T, Y, T2).
例如:

?- sum_first_quadrant([[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]], Z).
Z = 22 ;
false.
注 您可以使用
if\u3
(=)/3
从以下位置删除
二分法中的无关选择点:


我缩进了你的代码-等待批准。没有它,你很难知道你想要什么——泰,你能帮我吗?我是Prolog swi的初学者,我可以用JS或C来做,也许你能帮我?
dichotomize_(L, X, D) :-
    X #>= 0,
    if_(X = 0,
        D = [],
        (   Y #= X - 1,
            L = [H|T],
            D = [H|T2],
            dichotomize_(T, Y, T2)
        )
    ).