Prolog "aggregate"

Admin User, erstellt 16. Feb. 2025
         
/**
* Warranty & Liability
* To the extent permitted by applicable law and unless explicitly
* otherwise agreed upon, XLOG Technologies AG makes no warranties
* regarding the provided information. XLOG Technologies AG assumes
* no liability that any problems might be solved with the information
* provided by XLOG Technologies AG.
*
* Rights & License
* All industrial property rights regarding the information - copyright
* and patent rights in particular - are the sole property of XLOG
* Technologies AG. If the company was not the originator of some
* excerpts, XLOG Technologies AG has at least obtained the right to
* reproduce, change and translate the information.
*
* Reproduction is restricted to the whole unaltered document. Reproduction
* of the information is only allowed for non-commercial uses. Selling,
* giving away or letting of the execution of the library is prohibited.
* The library can be distributed as part of your applications and libraries
* for execution provided this comment remains unchanged.
*
* Restrictions
* Only to be distributed with programs that add significant and primary
* functionality to the library. Not to be distributed with additional
* software intended to replace any components of the library.
*
* Trademarks
* Jekejeke is a registered trademark of XLOG Technologies AG.
*/
runner_file(extend, aggregate, 'XLOG 3.1 aggregate').
q(A, _, A).
q(_, A, A).
q(A, _, A).
/****************************************************************/
/* Bagof Predicates */
/****************************************************************/
/* bagof(T, Q, L) */
runner_pred(bagof,3, extend, aggregate, 'ISO 8.10.2.4').
runner_case(bagof,3, extend, aggregate, 'ISO 8.10.2.4, XLOG 1') :-
findall(Y-L, bagof(X, ((Y=2;Y=1;Y=2), between(1,3,X)), L), R),
R == [1-[1, 2, 3], 2-[1, 2, 3, 1, 2, 3]].
runner_case(bagof,3, extend, aggregate, 'ISO 8.10.2.4, ISO 2') :-
bagof(X, (X = 1; X = 2), X),
X == [1, 2].
runner_case(bagof,3, extend, aggregate, 'ISO 8.10.2.4, ISO 3') :-
bagof(X, (X = Y; X = Z), S),
S == [Y, Z].
runner_case(bagof,3, extend, aggregate, 'ISO 8.10.2.4, ISO 4') :-
\+ bagof(_, fail, _).
runner_case(bagof,3, extend, aggregate, 'ISO 8.10.2.4, XLOG 2') :-
findall(Y-S, bagof(X, ((Y=A;Y=_;Y=A), between(1,3,X)), S), R),
R = [C-[1, 2, 3, 1, 2, 3], D-[1, 2, 3]], C \== D.
runner_case(bagof,3, extend, aggregate, 'ISO 8.10.2.4, ISO 6') :-
bagof(f(X,Y), (X = a; Y = b), L), L = [f(a,A), f(B,b)],
var(A), A \== X, A \== Y,
var(B), B \== X, B \== Y,
A \== B.
runner_case(bagof,3, extend, aggregate, 'ISO 8.10.2.4, ISO 7') :-
bagof(X, Y^((X = 1, Y = 1); (X = 2, Y = 2)), S),
S == [1, 2].
runner_case(bagof,3, extend, aggregate, 'ISO 8.10.2.4, ISO 8') :-
bagof(X, Y^((X = 1; Y = 1); (X = 2, Y = 2)), S),
S = [1, A, 2], var(A), A \== X, A \== Y.
runner_case(bagof,3, extend, aggregate, 'ISO 8.10.2.4, ISO 9') :-
catch(bagof(X, (Y^(X = 1 ; Y = 2) ; X = 3), _), error(E, _), true),
nonvar(E), E = existence_error(_, (^) / 2).
runner_case(bagof,3, extend, aggregate, 'ISO 8.10.2.4, ISO 10a') :-
bagof(X, (X = Y; X = Z; Y = 1), L),
var(Y), L == [Y, Z].
runner_case(bagof,3, extend, aggregate, 'ISO 8.10.2.4, ISO 10b') :-
bagof(X, (X = Y; X = Z; Y = 1), L), Y == 1,
L = [A], var(A), A \== X, A \== Z.
runner_case(bagof,3, extend, aggregate, 'ISO 8.10.2.4, ISO 11') :-
bagof(X, a(X, Y), L),
Y = f(A), var(A), A \== X, A \== Y,
L == [1, 2].
runner_case(bagof,3, extend, aggregate, 'ISO 8.10.2.4, ISO 12a') :-
bagof(X, b(X, Y), L),
Y == 1, L == [1, 1, 2].
runner_case(bagof,3, extend, aggregate, 'ISO 8.10.2.4, ISO 12b') :-
bagof(X, b(X, Y), L),
Y == 2, L == [1, 2, 2].
runner_case(bagof,3, extend, aggregate, 'ISO 8.10.2.4, ISO 13') :-
catch(bagof(_, _^_, _), error(E, _), true),
E == instantiation_error.
runner_case(bagof,3, extend, aggregate, 'ISO 8.10.2.4, ISO 14') :-
catch(bagof(_, 1, _), error(E, _), true),
E == type_error(callable, 1).
runner_case(bagof,3, extend, aggregate, 'ISO 8.10.2.4, XLOG 3a') :-
bagof(none, q(X,_,Z), L), X == Z,
L == [none, none].
runner_case(bagof,3, extend, aggregate, 'ISO 8.10.2.4, XLOG 3b') :-
bagof(none, q(_,Y,Z), L), Y == Z,
L == [none].
runner_case(bagof,3, extend, aggregate, 'ISO 8.10.2.4, XLOG 4a') :-
bagof(X, q(X,Y,Z), L), Y == Z,
L = [A], var(A), A \== Y.
runner_case(bagof,3, extend, aggregate, 'ISO 8.10.2.4, XLOG 4b') :-
bagof(X, q(X,Y,Z), L), Y \== Z,
L == [Z, Z].
runner_case(bagof,3, extend, aggregate, 'ISO 8.10.2.4, XLOG 5a') :-
bagof(Y, q(X,Y,Z), L), X == Z,
L = [A, B], var(A), A \== X,
var(B), B \== X, A \== B.
runner_case(bagof,3, extend, aggregate, 'ISO 8.10.2.4, XLOG 5b') :-
bagof(Y, q(X,Y,Z), L), X \== Z,
L == [Z].
/* setof(T, Q, L) */
runner_pred(setof,3, extend, aggregate, 'ISO 8.10.3.4, Corrigendum 1').
runner_case(setof,3, extend, aggregate, 'ISO 8.10.3.4, XLOG 1') :-
findall(Y-L, setof(X, ((Y=2;Y=1;Y=2), between(1,3,X)), L), R),
R == [1-[1, 2, 3], 2-[1, 2, 3]].
runner_case(setof,3, extend, aggregate, 'ISO 8.10.3.4, ISO 2') :-
setof(X, (X = 1; X = 2), X),
X == [1, 2].
runner_case(setof,3, extend, aggregate, 'ISO 8.10.3.4, ISO 3') :-
setof(X, (X = 2; X = 1), S),
S == [1, 2].
runner_case(setof,3, extend, aggregate, 'ISO 8.10.3.4, ISO 4') :-
setof(X, (X = 2; X = 2), S),
S == [2].
runner_case(setof,3, extend, aggregate, 'ISO 8.10.3.4, ISO 5') :-
setof(X, (X = Y; X = Z), S),
(S == [Y, Z]; S == [Z, Y]).
runner_case(setof,3, extend, aggregate, 'ISO 8.10.3.4, ISO 6') :-
\+ setof(_, fail, _).
runner_case(setof,3, extend, aggregate, 'ISO 8.10.3.4, XLOG 2') :-
findall(Y-S, setof(X, ((Y=A;Y=_;Y=A), between(1,3,X)), S), R),
R = [C-[1, 2, 3], D-[1, 2, 3]], C \== D.
runner_case(setof,3, extend, aggregate, 'ISO 8.10.3.4, ISO 8') :-
setof(f(X,Y), (X = a; Y = b), L), L=[f(B,b), f(a,A)],
var(A), A \== X, A \== Y,
var(B), B \== X, B \== Y,
A \== B.
runner_case(setof,3, extend, aggregate, 'ISO 8.10.3.4, ISO 9') :-
setof(X, Y^((X = 1, Y = 1); (X = 2, Y = 2)), S),
S == [1, 2].
runner_case(setof,3, extend, aggregate, 'ISO 8.10.3.4, ISO 10') :-
setof(X, Y^((X = 1; Y = 1); (X = 2, Y = 2)), S),
S = [A, 1, 2], var(A), A \== X, A \== Y.
runner_case(setof,3, extend, aggregate, 'ISO 8.10.3.4, ISO 11') :-
catch(setof(X, (Y^(X = 1 ; Y = 2) ; X = 3), _), error(E, _), true),
nonvar(E), E=existence_error(_, (^) / 2).
runner_case(setof,3, extend, aggregate, 'ISO 8.10.3.4, ISO 12a') :-
setof(X, (X = Y; X = Z; Y = 1), L),
var(Y), (L == [Y, Z]; L == [Z, Y]).
runner_case(setof,3, extend, aggregate, 'ISO 8.10.3.4, ISO 12b') :-
setof(X, (X = Y; X = Z; Y = 1), L), Y == 1,
L = [A], var(A), A \== X, A \== Z.
runner_case(setof,3, extend, aggregate, 'ISO 8.10.3.4, ISO 13') :-
setof(X, a(X, Y), L), Y=f(A), var(A), A \== X, A \== Y, L == [1, 2].
runner_case(setof,3, extend, aggregate, 'ISO 8.10.3.4, ISO 14') :-
setof(X, member(X, [f(U,b),f(V,c)]), L), (L == [f(U,b),f(V,c)]; L == [f(V,c),f(U,b)]).
runner_case(setof,3, extend, aggregate, 'ISO 8.10.3.4, ISO 15a') :-
\+ setof(X, member(X, [f(U,b),f(V,c)]), [f(a,c),f(a,b)]);
\+ setof(X, member(X, [f(U,b),f(V,c)]), [f(a,b),f(a,c)]).
runner_case(setof,3, extend, aggregate, 'ISO 8.10.3.4, ISO 15b') :-
setof(X, member(X, [f(U,b),f(V,c)]), [f(a,c),f(a,b)]), U == a, V == a;
setof(X, member(X, [f(U,b),f(V,c)]), [f(a,b),f(a,c)]), U == a, V == a.
runner_case(setof,3, extend, aggregate, 'ISO 8.10.3.4, ISO 16') :-
setof(X, member(X, [f(b,U),f(c,V)]), [f(b,a),f(c,a)]), U == a, V == a.
runner_case(setof,3, extend, aggregate, 'ISO 8.10.3.4, ISO 17') :-
setof(X, member(X, [V,U,f(U),f(V)]), L), (L == [U,V,f(U),f(V)]; L == [V,U,f(V),f(U)]).
runner_case(setof,3, extend, aggregate, 'ISO 8.10.3.4, ISO 18') :-
setof(X, member(X, [V,U,f(U),f(V)]), [a,b,f(a),f(b)]), (U == a, V == b; U == b, V == a).
runner_case(setof,3, extend, aggregate, 'ISO 8.10.3.4, ISO 19') :-
\+ setof(X, member(X, [V,U,f(U),f(V)]), [a,b,f(b),f(a)]).
runner_case(setof,3, extend, aggregate, 'ISO 8.10.3.4, ISO 20') :-
setof(X, exists(U,V)^member(X, [V,U,f(U),f(V)]), [a,b,f(a),f(b)]).
runner_case(setof,3, extend, aggregate, 'ISO 8.10.3.4, ISO 21a') :-
setof(X, b(X, Y), L), Y == 1, L == [1, 2].
runner_case(setof,3, extend, aggregate, 'ISO 8.10.3.4, ISO 21b') :-
setof(X, b(X, Y), L), Y == 2, L == [1, 2].
runner_case(setof,3, extend, aggregate, 'ISO 8.10.3.4, ISO 22') :-
setof(X-Xs, Y^setof(Y, b(X,Y), Xs), L),
L == [1 - [1, 2], 2 - [1, 2]].
runner_case(setof,3, extend, aggregate, 'ISO 8.10.3.4, ISO 23') :-
setof(X-Xs, setof(Y, b(X,Y), Xs), L),
L == [1 - [1, 2], 2 - [1, 2]].
runner_case(setof,3, extend, aggregate, 'ISO 8.10.3.4, ISO 24') :-
setof(X-Xs, bagof(Y, b(X,Y), Xs), L),
L == [1 - [1, 2, 1], 2 - [2, 1, 2]].
runner_case(setof,3, extend, aggregate, 'ISO 8.10.3.4, XLOG 3a') :-
setof(none, q(X,_,Z), L), X == Z,
L == [none].
runner_case(setof,3, extend, aggregate, 'ISO 8.10.3.4, XLOG 3b') :-
setof(none, q(_,Y,Z), L), Y == Z,
L == [none].
runner_case(setof,3, extend, aggregate, 'ISO 8.10.3.4, XLOG 4a') :-
setof(X, q(X,Y,Z), L), Y == Z,
L = [A], var(A), A \== Y.
runner_case(setof,3, extend, aggregate, 'ISO 8.10.3.4, XLOG 4b') :-
setof(X, q(X,Y,Z), L), Y \== Z,
L == [Z].
runner_case(setof,3, extend, aggregate, 'ISO 8.10.3.4, XLOG 5a') :-
setof(Y, q(X,Y,Z), L), X == Z,
L = [A, B], var(A), A \== X,
var(B), B \== X, A \== B.
runner_case(setof,3, extend, aggregate, 'ISO 8.10.3.4, XLOG 5b') :-
setof(Y, q(X,Y,Z), L), X \== Z,
L == [Z].
/****************************************************************/
/* Aggregate */
/****************************************************************/
/* aggregate_all(A, Q, S) */
runner_pred(aggregate_all,3, extend, aggregate, 'XLOG 3.1.2').
runner_case(aggregate_all,3, extend, aggregate, 'XLOG 3.1.2, XLOG 1') :-
aggregate_all(sum(X), between(1,10,X), S),
S == 55.
runner_case(aggregate_all,3, extend, aggregate, 'XLOG 3.1.2, XLOG 2') :-
aggregate_all((sum(X),max(X)), between(1,10,X), S),
S == (55,10).
runner_case(aggregate_all,3, extend, aggregate, 'XLOG 3.1.2, XLOG 3') :-
aggregate_all(sum(1), fail, S),
S == 0.
runner_case(aggregate_all,3, extend, aggregate, 'XLOG 3.1.2, XLOG 4') :-
catch(aggregate_all(_, between(1,10,_), _), error(E,_), true),
E == instantiation_error.
runner_case(aggregate_all,3, extend, aggregate, 'XLOG 3.1.2, XLOG 5') :-
catch(aggregate_all(sum(_), 1, _), error(E,_), true),
E == type_error(callable,1).
runner_case(aggregate_all,3, extend, aggregate, 'XLOG 3.1.2, XLOG 6') :-
aggregate_all(bag(X), member(X,[goedel,escher,bach]), S),
S == [goedel,escher,bach].
/* aggregate(A, Q, R) */
runner_pred(aggregate,3, extend, aggregate, 'XLOG 3.1.3').
runner_case(aggregate,3, extend, aggregate, 'XLOG 3.1.3, XLOG 1') :-
findall(Y-S, aggregate(sum(X), ((Y=2;Y=1;Y=2), between(1,3,X)), S), R),
R == [1-6, 2-12].
runner_case(aggregate,3, extend, aggregate, 'XLOG 3.1.3, XLOG 2') :-
findall(Y-S, aggregate((sum(X),max(X)), ((Y=A;Y=_;Y=A), between(1,3,X)), S), R),
R = [C-(12, 3), D-(6, 3)], C \== D.
runner_case(aggregate,3, extend, aggregate, 'XLOG 3.1.3, XLOG 3') :-
\+ aggregate(sum(1), fail, _).
runner_case(aggregate,3, extend, aggregate, 'XLOG 3.1.3, XLOG 4') :-
aggregate(mul(X), between(1, 10, X), S),
S == 3628800.
runner_case(aggregate,3, extend, aggregate, 'XLOG 3.1.3, XLOG 5') :-
catch(aggregate(_, ((Y=1;Y=2),between(1,10,_)), _), error(E,_), true),
E == instantiation_error.
runner_case(aggregate,3, extend, aggregate, 'XLOG 3.1.3, XLOG 6') :-
catch(aggregate(sum(_), ((Y=1;Y=2),1), _), error(E,_), true),
E == type_error(callable,1).
runner_case(aggregate,3, extend, aggregate, 'XLOG 3.1.3, XLOG 7') :-
aggregate(set(X), member(X,[goedel,escher,bach]), S),
S == [bach, escher, goedel].
runner_case(aggregate,3, extend, aggregate, 'XLOG 3.1.3, XLOG 8a') :-
aggregate(count, q(X,_,Z), L), X == Z,
L == 2.
runner_case(aggregate,3, extend, aggregate, 'XLOG 3.1.3, XLOG 8b') :-
aggregate(count, q(_,Y,Z), L), Y == Z,
L == 1.
runner_case(aggregate,3, extend, aggregate, 'XLOG 3.1.3, XLOG 9a') :-
aggregate(set(X), q(X,Y,Z), L), Y == Z,
L = [A], var(A), A \== Y.
runner_case(aggregate,3, extend, aggregate, 'XLOG 3.1.3, XLOG 9b') :-
aggregate(set(X), q(X,Y,Z), L), Y \== Z,
L == [Z].
runner_case(aggregate,3, extend, aggregate, 'XLOG 3.1.3, XLOG 10a') :-
aggregate(bag(Y), q(X,Y,Z), L), X == Z,
L = [A, B], var(A), A \== X,
var(B), B \== X, A \== B.
runner_case(aggregate,3, extend, aggregate, 'XLOG 3.1.3, XLOG 10b') :-
aggregate(bag(Y), q(X,Y,Z), L), X \== Z,
L == [Z].