e5f4633c39
which included commits to RCS files with non-trunk default branches. git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@5 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
130 lines
2.9 KiB
Prolog
130 lines
2.9 KiB
Prolog
% This file has been included as an YAP library by Vitor Santos Costa, 1999
|
|
|
|
% File : ASSOC.PL
|
|
% Author : R.A.O'Keefe
|
|
% Updated: 9 November 1983
|
|
% Purpose: Binary tree implementation of "association lists".
|
|
|
|
% Note : the keys should be ground, the associated values need not be.
|
|
|
|
:- module(assoc, [
|
|
assoc_to_list/2,
|
|
gen_assoc/3,
|
|
get_assoc/3,
|
|
get_assoc/5,
|
|
list_to_assoc/2,
|
|
map_assoc/3,
|
|
ord_list_to_assoc/2,
|
|
put_assoc/4,
|
|
empty_assoc/1
|
|
]).
|
|
|
|
:- meta_predicate map_assoc(:, ?, ?).
|
|
|
|
/*
|
|
:- mode
|
|
assoc_to_list(+, -),
|
|
assoc_to_list(+, -, +),
|
|
gen_assoc(+, ?, ?),
|
|
get_assoc(+, +, ?),
|
|
get_assoc(+, +, +, +, +, ?),
|
|
list_to_assoc(+, -),
|
|
list_to_assoc(+, +, -, +),
|
|
map_assoc(+, +, -),
|
|
put_assoc(+, +, +, -),
|
|
put_assoc(+, +, +,+,+,+, +, -).
|
|
*/
|
|
|
|
|
|
empty_assoc(t).
|
|
|
|
assoc_to_list(Assoc, List) :-
|
|
assoc_to_list(Assoc, List, []).
|
|
|
|
|
|
assoc_to_list(t(Key,Val,L,R), List, Rest) :-
|
|
assoc_to_list(L, List, [Key-Val|More]),
|
|
assoc_to_list(R, More, Rest).
|
|
assoc_to_list(t, List, List).
|
|
|
|
|
|
|
|
gen_assoc(t(_,_,L,_), Key, Val) :-
|
|
gen_assoc(L, Key, Val).
|
|
gen_assoc(t(Key,Val,_,_), Key, Val).
|
|
gen_assoc(t(_,_,_,R), Key, Val) :-
|
|
gen_assoc(R, Key, Val).
|
|
|
|
|
|
|
|
get_assoc(Key, t(K,V,L,R), Val) :-
|
|
compare(Rel, Key, K),
|
|
get_assoc(Rel, Key, V, L, R, Val).
|
|
|
|
|
|
get_assoc(=, _, Val, _, _, Val).
|
|
get_assoc(<, Key, _, Tree, _, Val) :-
|
|
get_assoc(Key, Tree, Val).
|
|
get_assoc(>, Key, _, _, Tree, Val) :-
|
|
get_assoc(Key, Tree, Val).
|
|
|
|
|
|
get_assoc(Key, t(K,V,L,R), Val, t(K,NV,NL,NR), NVal) :-
|
|
compare(Rel, Key, K),
|
|
get_assoc(Rel, Key, V, L, R, Val, NV, NL, NR, NVal).
|
|
|
|
|
|
get_assoc(=, _, Val, L, R, Val, NVal, L, R, NVal).
|
|
get_assoc(<, Key, V, L, R, Val, V, NL, R, NVal) :-
|
|
get_assoc(Key, L, Val, NL, NVal).
|
|
get_assoc(>, Key, V, L, R, Val, V, L, NR, NVal) :-
|
|
get_assoc(Key, R, Val, NR, NVal).
|
|
|
|
|
|
|
|
list_to_assoc(List, Assoc) :-
|
|
list_to_assoc(List, t, Assoc).
|
|
|
|
list_to_assoc([], Assoc, Assoc).
|
|
list_to_assoc([Key-Val|List], Assoc0, Assoc) :-
|
|
put_assoc(Key, Assoc0, Val, AssocI),
|
|
list_to_assoc(List, AssocI, Assoc).
|
|
|
|
ord_list_to_assoc(Keys, Assoc) :-
|
|
list_to_assoc(Keys, Assoc).
|
|
/*
|
|
length(Keys,L),
|
|
list_to_assoc(N, Keys, Assoc, []).
|
|
|
|
|
|
ord_list_to_assoc(0, List, t, List).
|
|
ord_list_to_assoc(N, List, t(Key,Val,L,R), Rest) :-
|
|
A is (N-1)//2,
|
|
Z is (N-1)-A,
|
|
ord_list_to_assoc(A, List, L, [Key-Val|More]),
|
|
ord_list_to_assoc(Z, More, R, Rest).
|
|
*/
|
|
|
|
map_assoc(Pred, t(Key,Val,L0,R0), t(Key,Ans,L1,R1)) :- !,
|
|
map_assoc(Pred, L0, L1),
|
|
assoc_apply(Pred, [Val,Ans]),
|
|
map_assoc(Pred, R0, R1).
|
|
map_assoc(_, t, t).
|
|
|
|
assoc_apply(Pred,Args) :-
|
|
G =.. [Pred,Args],
|
|
call(G), !.
|
|
|
|
put_assoc(Key, t(K,V,L,R), Val, New) :-
|
|
compare(Rel, Key, K),
|
|
put_assoc(Rel, Key, K, V, L, R, Val, New).
|
|
put_assoc(Key, t, Val, t(Key,Val,t,t)).
|
|
|
|
|
|
put_assoc(=, Key, _, _, L, R, Val, t(Key,Val,L,R)).
|
|
put_assoc(<, Key, K, V, L, R, Val, t(K,V,Tree,R)) :-
|
|
put_assoc(Key, L, Val, Tree).
|
|
put_assoc(>, Key, K, V, L, R, Val, t(K,V,L,Tree)) :-
|
|
put_assoc(Key, R, Val, Tree).
|
|
|