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)
)
).