mirror of
https://github.com/Mercury-Language/mercury.git
synced 2026-04-24 13:53:54 +00:00
Estimated hours taken: 0.1 Add the DPPD (dozens of problems in partial deduction) suite to the tests directory.
77 lines
1.3 KiB
Mathematica
77 lines
1.3 KiB
Mathematica
|
|
:- module upto_sum_impl.
|
|
|
|
:- interface.
|
|
|
|
:- pred sumsquaresupto(int::in, int::out) is det.
|
|
|
|
|
|
:- type tree(T)
|
|
---> leaf(T)
|
|
; branch(tree(T), tree(T)).
|
|
|
|
:- pred sumtrsquaretr(tree(int)::in, int::out) is det.
|
|
|
|
:- implementation.
|
|
|
|
:- import_module int, list.
|
|
|
|
sumsquaresupto(N,S) :-
|
|
upto(1,N,Ns),
|
|
squares(Ns,SONs),
|
|
sum(SONs,S).
|
|
|
|
sumtrsquaretr(XT,S) :-
|
|
squaretr(XT,SOXt),
|
|
sumtr(SOXt,S).
|
|
|
|
:- pred upto(int::in, int::in, list(int)::out) is det.
|
|
|
|
upto(M,N,Ms) :-
|
|
( M>N ->
|
|
Ms = []
|
|
;
|
|
M1 is M + 1,
|
|
upto(M1,N,Ms1),
|
|
Ms = [M | Ms1]
|
|
).
|
|
|
|
:- pred sum(list(int)::in, int::out) is det.
|
|
|
|
sum(Ns,S) :- sum1(Ns,0,S).
|
|
|
|
:- pred sum1(list(int)::in, int::in, int::out) is det.
|
|
|
|
sum1([],S,S).
|
|
sum1([N|Ns],A,S) :-
|
|
A1 is A + N,
|
|
sum1(Ns,A1,S).
|
|
|
|
:- pred square(int::in, int::out) is det.
|
|
|
|
square(N,SON) :- SON is N * N.
|
|
|
|
:- pred squares(list(int)::in, list(int)::out) is det.
|
|
|
|
squares([],[]).
|
|
squares([N|Ns],[SON|SONs]) :-
|
|
square(N,SON),
|
|
squares(Ns,SONs).
|
|
|
|
:- pred sumtr(tree(int)::in, int::out) is det.
|
|
|
|
sumtr(leaf(X),X).
|
|
sumtr(branch(Xt,Yt),S) :-
|
|
sumtr(Xt,SX),
|
|
sumtr(Yt,SY),
|
|
S is SX + SY.
|
|
|
|
:- pred squaretr(tree(int)::in, tree(int)::out) is det.
|
|
|
|
squaretr(leaf(X),leaf(SOX)) :-
|
|
square(X,SOX).
|
|
squaretr(branch(Xt,Yt),branch(SOXt,SOYt)) :-
|
|
squaretr(Xt,SOXt),
|
|
squaretr(Yt,SOYt).
|
|
|