This repository has been archived on 2023-08-20. You can view files and clone it, but cannot push or open issues or pull requests.
yap-6.3/packages/udi/b+tree/b+tree.yap
2015-10-13 08:17:51 +01:00

76 lines
2.0 KiB
Prolog

:- load_foreign_files(['libudi_b+tree'],[],udi_btree_init).
:- op(700,fx,max).
:- op(700,fx,min).
:- op(700,xfx,#==).
:- op(700,xfx,#>).
:- op(700,xfx,#<).
:- op(700,xfx,#>=).
:- op(700,xfx,#=<).
max X :- %%this overrides any previous att
attributes:put_att_term(X,max(C)).
min X :- %%this overrides any previous att
attributes:put_att_term(X,min(C)).
X #== Y :-%%this overrides any previous att
attributes:put_att_term(X,eq(C,Y)).
%% range definition
X #> Y :-
attributes:get_all_atts(X,C),
c1(C,gt(_,Y),NC),
attributes:put_att_term(X,NC).
X #>= Y :-
attributes:get_all_atts(X,C),
c1(C,ge(_,Y),NC),
attributes:put_att_term(X,NC).
X #=< Y :-
attributes:get_all_atts(X,C),
c1(C,le(_,Y),NC),
attributes:put_att_term(X,NC).
X #< Y :-
attributes:get_all_atts(X,C),
c1(C,lt(_,Y),NC),
attributes:put_att_term(X,NC).
c1(A,X,X) :-
var(A), !.
c1(gt(_,X),gt(_,Y),gt(_,Z)) :-
Z is max(X,Y).
c1(gt(_,X),ge(_,Y),ge(_,Y)) :-
Y is max(X,Y).
c1(gt(_,X),ge(_,Y),gt(_,X)) :-
X is max(X,Y).
c1(ge(_,X),ge(_,Y),ge(_,Z)) :-
Z is max(X,Y).
c1(ge(_,X),gt(_,Y),ge(_,X)) :-
X is max(X,Y).
c1(ge(_,X),gt(_,Y),gt(_,Y)) :-
Y is max(X,Y).
c1(lt(_,X),lt(_,Y),lt(_,Z)) :-
Z is min(X,Y).
c1(lt(_,X),le(_,Y),le(_,Y)) :-
Y is min(X,Y).
c1(lt(_,X),le(_,Y),lt(_,X)) :-
X is min(X,Y).
c1(le(_,X),ge(_,Y),le(_,Z)) :-
Z is min(X,Y).
c1(le(_,X),lt(_,Y),le(_,X)) :-
X is min(X,Y).
c1(le(_,X),lt(_,Y),lt(_,Y)) :-
Y is min(X,Y).
/*range construct*/
c1(gt(_,X),lt(_,Y),range(_,X,false,Y,false)).
c1(gt(_,X),le(_,Y),range(_,X,false,Y,true)).
c1(lt(_,Y),gt(_,X),range(_,X,false,Y,false)).
c1(lt(_,Y),ge(_,X),range(_,X,true,Y,false)).
c1(le(_,Y),gt(_,X),range(_,X,false,Y,true)).
c1(le(_,Y),ge(_,X),range(_,X,true,Y,true)).
c1(ge(_,X),lt(_,Y),range(_,X,true,Y,false)).
c1(ge(_,X),le(_,Y),range(_,X,true,Y,true)).
/*still needs to construct range +stuff*/