:- load_files(	[best,abcde,cond],
				[silent(true),if(not_loaded)]).


learn(W,A) --> stagger(50,W,A).

stagger(0,_,_) --> [].
stagger(N0,W,A) --> {N is N0 - 1}, stagger1(W,A),!,stagger(N,W,A).

asList([],[]).
asList([H=X0|T0],[H=X|T]) :-
	asList1(X0,X),
	asList(T0,T).

asList1([H|T],[H|T]) :- !.
asList1(H  ,[H]  ).

stagger1(W,A0,B0,B) :-
	print(7),nl,
	pick2(B0,_=One0,_=Two0),
	print(8),nl,
	asList(One0,One),
	asList(Two0,Two),
	print(9),nl,
	append(One,Two,Three),
	print(4),nl,
	combine(Three,Four),
	print(5),nl,
	(instances(Four,W,Instances)
	->  print(3),nl,
        abcdes(Instances,A0,A),
	    balance(A,Bal),
		hash_term(Four,H),
		Bal1 is Bal + (H mod 100)/1000000,
	    best(Bal1=Four,X,B0,B),
		print(X) 
    ;   print(-),nl,
		print(one0  = One0),nl,
		print(two0  = Two0),nl,
		print(one   = One),nl,
		print(two   = Two),nl,
		print(three = Three),nl,
		print(four  = Four),nl,
		B=B0
    ).

instances([H|T],W,L) :-
	instances1(H,W,L0),
	instances2(T,W,L0,L),
	L=[_|_].

instances2([],_,L,L). 
instances2([Var=Details|Rest],W,L0,L ) :- 
	instances1(Var=Details,W,L1),
	intersection(L0,L1,L2),
	instances2(Rest,W,L2,L).

instances1(Var=Range,W,I) :-
	rangeUnion(Range,Var,W,[],I).
		
rangeUnion([],_,_,X,X).
rangeUnion([H|T],Var,W,B4,Out) :-
	wme_(independentRange,H*Var=Details,W),
	union(B4,Details,Temp),
	rangeUnion(T,Var,W,Temp,Out).
