/* a pseudo-B-tree */
createSet(Size,T) :- Size < 21, Size1 is Size+1,
				functor(T,f,Size1),
				arg(Size1,T,Size).

createSet(Size,T) :- Size > 20, functor(T,f,21),
				arg(21,T,Size),
				NewSize is Size/19,
				LastSize is Size - (NewSize*19),
				construct(T, NewSize, LastSize, 1).


construct(T, Size, Lsize, 20) :- createSet(Lsize, T1), arg(20, T, T1).

construct(T, Size, Lsize, Index) :- Index < 20,
				    createSet(Size, T1), 
				    arg(Index, T, T1),
				    Index1 is Index+1,   
				    construct(T, Size, Lsize, Index1).

bind(T,Position,Value) :- functor(T,f,Arity), Arity < 21,
					      arg(Position,T,Value).

bind(T,Position,Value) :- functor(T,f,Arity), Arity = 21,
					      arg(21, T, Size),
					      Jump is Size/19,
					      Position > (Jump*19),
					      NewPos is Position - (Jump*19),
					      arg(20,T,T1),
					      bind(T1,NewPos,Value).
								      
bind(T, Position, Value) :- functor(T,f,Arity), Arity = 21,
						arg(21, T, Size),
						Jump is Size/19,
						Position =< (Jump*19),
						Subtree is ((Position-1)/Jump)+1,
						newmod(Position, Jump, NewPos),
						arg(Subtree, T, T1),
						bind(T1, NewPos, Value).


/* newmod returns 1..N and not 0..N-1 */

newmod(X,X,X).
newmod(X,Y,X) :- X < Y.
newmod(X,Y,Z) :- X > Y, X1 is X - Y, newmod(X1,Y,Z).

?- createSet(15,X).