/****************************/ /* plug-in architecture */ /* of HCLP interpreter */ /* -----plug-in module----- */ /* WCB comparator component */ /* (c) R. Bart‡k */ /* 1996 */ /****************************/ % this module implements a worst-case-better comparator for % general hierarchy solver (GHSmod.pr) % it is a plug-in module of plug-in architecture for HCLP % to get a complete comparator module, you need to define procedures % solve_constr, solve_constr_list (in FCSmod.pr) solve_level(Cs,PartAnsws,NewAnsws):- pre_solve_level(Cs,[],PartAnsws,[],NewAnsws,0,-1,_). pre_solve_level(_,_,[],OldAnsws,OldAnsws,_,OldMin,OldMin):-!. %just to speedup pre_solve_level([(C,W)|Cs],TestCons,PartAnsws,OldAnsws,NewAnsws, CurrMax,OldMin,NewMin):- differ_answs(C,PartAnsws,PartSatAnsws,_), set_max(W,CurrMax,NewMax), pre_solve_level(Cs,TestCons,PartSatAnsws,OldAnsws,PreAnsws,CurrMax,OldMin,PreMin), pre_solve_level(Cs,[C|TestCons],PartAnsws,PreAnsws,NewAnsws,NewMax,PreMin,NewMin). pre_solve_level([],TestCons,CurrAnsws,OldAnsws,NewAnsws,CurrMax,OldMin,PreMin):- select_answ_by_test(TestCons,CurrAnsws,SelAnsws), solve_empty_level(SelAnsws,OldAnsws,NewAnsws,CurrMax,OldMin,PreMin). solve_empty_level([],OldAnsws,OldAnsws,_,OldMin,OldMin):-!. solve_empty_level(CurrAnsws,_,CurrAnsws,CurrMax,-1,CurrMax):-!. solve_empty_level(CurrAnsws,OldAnsws,NewAnsws,CurrMax,OldMin,CurrMax):- CurrMax=OldMin, append(CurrAnsws,OldAnsws,NewAnsws),!. solve_empty_level(CurrAnsws,_,CurrAnsws,CurrMax,OldMin,CurrMax):- CurrMaxOldMin. select_answ_by_test(Cs,[A|As],[A|NAs]):- test(Cs,A),!, select_answ_by_test(Cs,As,NAs). select_answ_by_test(Cs,[A|As],NAs):- select_answ_by_test(Cs,As,NAs). select_answ_by_test(_,[],[]). test([C|Cs],A):- not solve_constr_list([C|A],[],_), test(Cs,A). test([],_). set_max(A,B,A):- A>=B. set_max(A,B,B):- B>A. differ_answs(C,[A|As],RAs,[A|NAs]):- not solve_constr_list([C|A],[],_),!, differ_answs(C,As,RAs,NAs). differ_answs(C,[A|As],[[C|A]|RAs],NAs):- differ_answs(C,As,RAs,NAs). differ_answs(_,[],[],[]). select_answer(A,As):- member(SelA,As), solve_constr_list(SelA,[],A). append([H|T],L,[H|NT]):- append(T,L,NT). append([],L,L).