From: Mark Thom Date: Fri, 21 Feb 2020 19:48:15 +0000 (-0700) Subject: adopt compatibility predicates from clpb and clpz into lists and pairs libraries X-Git-Tag: v0.8.119~80 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=2613ef0633d74b491b5feaecf5bcee2a2ef9b575;p=scryer-prolog.git adopt compatibility predicates from clpb and clpz into lists and pairs libraries --- diff --git a/src/prolog/lib/clpb.pl b/src/prolog/lib/clpb.pl index 3fa9c719..561a7ae4 100644 --- a/src/prolog/lib/clpb.pl +++ b/src/prolog/lib/clpb.pl @@ -31,6 +31,7 @@ :- 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), []). @@ -106,65 +107,10 @@ type_error(Expectation, Term) :- 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]. @@ -1157,7 +1103,7 @@ labeling_var(V) :- V == 1, !. 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). @@ -1184,7 +1130,7 @@ indomain(1). % 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). @@ -1506,7 +1452,7 @@ max_variable_node(Node, V0-N0, V-N) :- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ 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), diff --git a/src/prolog/lib/lists.pl b/src/prolog/lib/lists.pl index 153b90ff..c373fb95 100644 --- a/src/prolog/lib/lists.pl +++ b/src/prolog/lib/lists.pl @@ -1,8 +1,8 @@ -:- 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)). @@ -44,6 +44,12 @@ select(X, [X|Xs], Xs). 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). @@ -102,14 +108,10 @@ maplist(Cont, [E1|E1s], [E2|E2s], [E3|E3s], [E4|E4s], [E5|E5s], [E6|E6s], [E7|E7 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. @@ -134,3 +136,16 @@ 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). + +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). diff --git a/src/prolog/lib/pairs.pl b/src/prolog/lib/pairs.pl new file mode 100644 index 00000000..f3b00108 --- /dev/null +++ b/src/prolog/lib/pairs.pl @@ -0,0 +1,21 @@ +:- 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).