:- use_module(library(atts)).
:- use_module(library(lists)).
:- use_module(library(non_iso)).
+:- use_module(library(pairs)).
:- use_module(library(dcgs)).
:- use_module(library(error), []).
type_error(Expectation, Term, Goal-Arg) :-
throw(error(type_error(Expectation, Term), type_error(Goal, Arg, Expectation, Term))).
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- foldl/4
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-
-foldl(Goal_3, Ls, A0, A) :-
- foldl_(Ls, Goal_3, A0, A).
-
-foldl_([], _, A, A).
-foldl_([L|Ls], G_3, A0, A) :-
- call(G_3, L, A0, A1),
- foldl_(Ls, G_3, A1, A).
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- foldl/5
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-
-foldl(Goal_4, Xs, Ys, A0, A) :-
- foldl_(Xs, Ys, Goal_4, A0, A).
-
-foldl_([], [], _, A, A).
-foldl_([X|Xs], [Y|Ys], G_4, A0, A) :-
- call(G_4, X, Y, A0, A1),
- foldl_(Xs, Ys, G_4, A1, A).
-
-
partition(Pred, Ls0, As, Bs) :-
include(Pred, Ls0, As),
exclude(Pred, Ls0, Bs).
-sum_list(Ls, S) :-
- foldl(sum_, Ls, 0, S).
-
-sum_(L, S0, S) :- S is S0 + L.
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Pairs.
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-
-pairs_keys_values([], [], []).
-pairs_keys_values([A-B|ABs], [A|As], [B|Bs]) :-
- pairs_keys_values(ABs, As, Bs).
-
-pairs_keys(Ps, Ks) :- pairs_keys_values(Ps, Ks, _).
-
-pairs_values(Ps, Vs) :- pairs_keys_values(Ps, _, Vs).
-
-map_list_to_pairs(Pred, Ls, Ps) :-
- map_list_to_pairs2(Ls, Pred, Ps).
-
-map_list_to_pairs2([], _, []).
-map_list_to_pairs2([H|T0], Pred, [K-H|T]) :-
- call(Pred, H, K),
- map_list_to_pairs2(T0, Pred, T).
-
-
-
-
-
goal_expansion(get_attr(Var, Module, Value), (var(Var),get_atts(Var, Access))) :-
Access =.. [Module,Value].
labeling_var(V) :- domain_error(clpb_variable, V).
variables_in_index_order(Vs0, Vs) :-
- maplist(var_with_index, Vs0, IVs0),
+ maplist(var_with_index, Vs0, IVs0),
keysort(IVs0, IVs),
pairs_values(IVs, Vs).
% Examples:
%
% ==
-% ?- sat(A =< B), Vs = [A,B], sat_count(+[1|Vs], Count).
+% ?- sat(A =< B), Vs = [A,B], sat_count(+[1|Vs], Count).
% Vs = [A, B],
% Count = 3,
% sat(A=:=A*B).
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
ands_fusion(Ands0, Ands) :-
- maplist(with_variables, Ands0, Pairs0),
+ maplist(with_variables, Ands0, Pairs0),
keysort(Pairs0, Pairs),
group_pairs_by_key(Pairs, Groups),
pairs_values(Groups, Andss),
-:- module(lists, [member/2, select/3, append/3, foldl/4, foldl/5,
+:- module(lists, [member/2, select/3, append/2, append/3, foldl/4, foldl/5,
memberchk/2, reverse/2, length/2, maplist/2,
maplist/3, maplist/4, maplist/5, maplist/6,
maplist/7, maplist/8, maplist/9, same_length/2,
- sumlist/2]).
+ sum_list/2, transpose/2]).
:- use_module(library(error)).
select(X, [Y|Xs], [Y|Ys]) :- select(X, Xs, Ys).
+append([], []).
+append([L0|Ls0], Ls) :-
+ append(L0, Rest, Ls),
+ append(Ls0, Rest).
+
+
append([], R, R).
append([X|L], R, [X|S]) :- append(L, R, S).
maplist(Cont, E1s, E2s, E3s, E4s, E5s, E6s, E7s, E8s).
-sumlist_([], S, S).
-sumlist_([N|Ns], S, S0) :-
- S1 is S0 + N,
- sumlist_(Ns, S, S1).
+sum_list(Ls, S) :-
+ foldl(sum_, Ls, 0, S).
-sumlist(Ns, S) :-
- must_be(list, Ns),
- sumlist_(Ns, S, 0).
+sum_(L, S0, S) :- S is S0 + L.
foldl_([X|Xs], [Y|Ys], G_4, A0, A) :-
call(G_4, X, Y, A0, A1),
foldl_(Xs, Ys, G_4, A1, A).
+
+transpose(Ls, Ts) :-
+ lists_transpose(Ls, Ts).
+
+lists_transpose([], []).
+lists_transpose([L|Ls], Ts) :-
+ maplist(same_length(L), Ls),
+ foldl(transpose_, L, Ts, [L|Ls], _).
+
+transpose_(_, Fs, Lists0, Lists) :-
+ maplist(list_first_rest, Lists0, Fs, Lists).
+
+list_first_rest([L|Ls], L, Ls).
--- /dev/null
+:- module(pairs, [pairs_keys_values/3,
+ pairs_keys/2,
+ pairs_values/2,
+ map_list_to_pairs/3]).
+
+
+pairs_keys_values([], [], []).
+pairs_keys_values([A-B|ABs], [A|As], [B|Bs]) :-
+ pairs_keys_values(ABs, As, Bs).
+
+pairs_keys(Ps, Ks) :- pairs_keys_values(Ps, Ks, _).
+
+pairs_values(Ps, Vs) :- pairs_keys_values(Ps, _, Vs).
+
+map_list_to_pairs(Pred, Ls, Ps) :-
+ map_list_to_pairs2(Ls, Pred, Ps).
+
+map_list_to_pairs2([], _, []).
+map_list_to_pairs2([H|T0], Pred, [K-H|T]) :-
+ call(Pred, H, K),
+ map_list_to_pairs2(T0, Pred, T).