Merge and aggregate datasets: Difference between revisions
Content added Content deleted
(Add Mercury task) |
(→{{header|Mercury}}: simplify bag_max) |
||
Line 707: | Line 707: | ||
:- pred bag_sum(pred(float)::(pred(out) is nondet), float::out) is det. |
:- pred bag_sum(pred(float)::(pred(out) is nondet), float::out) is det. |
||
:- pred bag_avg(pred(float)::(pred(out) is nondet), float::out) is det. |
:- pred bag_avg(pred(float)::(pred(out) is nondet), float::out) is det. |
||
⚫ | |||
bag_count(Predicate, Count) :- |
bag_count(Predicate, Count) :- |
||
promise_equivalent_solutions[Count] ( |
promise_equivalent_solutions[Count] ( |
||
Line 721: | Line 722: | ||
bag_sum(Predicate, Sum), |
bag_sum(Predicate, Sum), |
||
(if N = 0 then Avg = nan else Avg is Sum/float(N)). |
(if N = 0 then Avg = nan else Avg is Sum/float(N)). |
||
⚫ | |||
⚫ | |||
:- pred max_date(maybe_date::in, maybe_date::in, maybe_date::out) is det. |
|||
⚫ | |||
⚫ | |||
(pred(X::in,Y::in,Z::out) is det :- |
|||
max_date(date(Y1,M1,D1), date(Y2,M2,D2), Date) :- |
|||
compare(R,X,Y), |
|||
(if R = (>) then Z = X else Z = Y)), |
|||
Initial, Max)). |
|||
max_date(no, date(Y,M,D), date(Y,M,D)). |
|||
max_date(date(Y,M,D), no, date(Y,M,D)). |
|||
max_date(no, no, no). |
|||
⚫ | |||
⚫ | |||
⚫ | |||
main(!IO) :- |
main(!IO) :- |
||
Line 741: | Line 737: | ||
bag_avg(Scores, Avg), |
bag_avg(Scores, Avg), |
||
bag_sum(Scores, Sum), |
bag_sum(Scores, Sum), |
||
Dates = (pred(Date::out) is nondet :- visit(Id,Date,_)), |
Dates = (pred(Date::out) is nondet :- visit(Id,Date,_), Date=date(_,_,_)), |
||
bag_max(Dates, date(0,0,0), MaxDate1), |
|||
(if MaxDate1 = date(0,0,0) then MaxDate = no else MaxDate = MaxDate1)), |
|||
Solutions), |
Solutions), |
||
foldl(io.write_line, Solutions, !IO).</lang> |
foldl(io.write_line, Solutions, !IO).</lang> |