849 lines
		
	
	
		
			31 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			849 lines
		
	
	
		
			31 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | %% -*- prolog -*- | ||
|  | %%============================================================================= | ||
|  | %% Copyright (C) 2011 by Denys Duchier | ||
|  | %% | ||
|  | %% This program is free software: you can redistribute it and/or modify it | ||
|  | %% under the terms of the GNU Lesser General Public License as published by the | ||
|  | %% Free Software Foundation, either version 3 of the License, or (at your | ||
|  | %% option) any later version. | ||
|  | %%  | ||
|  | %% This program is distributed in the hope that it will be useful, but WITHOUT | ||
|  | %% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
|  | %% FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for | ||
|  | %% more details. | ||
|  | %%  | ||
|  | %% You should have received a copy of the GNU Lesser General Public License | ||
|  | %% along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||
|  | %%============================================================================= | ||
|  | 
 | ||
|  | :- module(gecode, [(:=)/2, op(500, xfx, ':='), | ||
|  | 		   (+=)/2, op(500, xfx, '+=')]). | ||
|  | 
 | ||
|  | :- op(500, xfx, ':='). | ||
|  | :- op(500, xfx, '+='). | ||
|  | :- load_foreign_files([gecode_yap],[],gecode_init). | ||
|  | 
 | ||
|  | is_int(X,Y) :- integer(X), Y=X. | ||
|  | is_int(X) :- integer(X). | ||
|  | 
 | ||
|  | is_bool_(true,true). | ||
|  | is_bool_(false,false). | ||
|  | is_bool(X,Y) :- nonvar(X), Y=X. | ||
|  | is_bool(X) :- is_bool(X,_). | ||
|  | 
 | ||
|  | is_IntVar_('IntVar'(I,K),N) :- | ||
|  |     integer(I), | ||
|  |     integer(K), | ||
|  |     nb_getval(gecode_space_use_keep_index,B), | ||
|  |     (B=true -> N=K ; N=I). | ||
|  | is_BoolVar_('BoolVar'(I,K),N) :- | ||
|  |     integer(I), | ||
|  |     integer(K), | ||
|  |     nb_getval(gecode_space_use_keep_index,B), | ||
|  |     (B=true -> N=K ; N=I). | ||
|  | is_SetVar_('SetVar'(I,K),N) :- | ||
|  |     integer(I), | ||
|  |     integer(K), | ||
|  |     nb_getval(gecode_space_use_keep_index,B), | ||
|  |     (B=true -> N=K ; N=I). | ||
|  | 
 | ||
|  | is_IntVar(X,I) :- nonvar(X), is_IntVar_(X,I). | ||
|  | is_BoolVar(X,I) :- nonvar(X), is_BoolVar_(X,I). | ||
|  | is_SetVar(X,I) :- nonvar(X), is_SetVar_(X,I). | ||
|  | 
 | ||
|  | is_IntVar(X) :- is_IntVar(X,_). | ||
|  | is_BoolVar(X) :- is_BoolVar(X,_). | ||
|  | is_SetVar(X) :- is_SetVar(X,_). | ||
|  | 
 | ||
|  | is_IntVarArgs_([],[]). | ||
|  | is_IntVarArgs_([H|T],[H2|T2]) :- is_IntVar(H,H2), is_IntVarArgs(T,T2). | ||
|  | is_IntVarArgs(X,Y) :- nonvar(X), is_IntVarArgs_(X,Y). | ||
|  | is_IntVarArgs(X) :- \+ \+ is_IntVarArgs(X,_). | ||
|  | 
 | ||
|  | is_BoolVarArgs_([],[]). | ||
|  | is_BoolVarArgs_([H|T],[H2|T2]) :- is_BoolVar(H,H2), is_BoolVarArgs(T,T2). | ||
|  | is_BoolVarArgs(X,Y) :- nonvar(X), is_BoolVarArgs_(X,Y). | ||
|  | is_BoolVarArgs(X) :- \+ \+ is_BoolVarArgs(X,_). | ||
|  | 
 | ||
|  | is_SetVarArgs_([],[]). | ||
|  | is_SetVarArgs_([H|T],[H2|T2]) :- is_SetVar(H,H2), is_SetVarArgs(T,T2). | ||
|  | is_SetVarArgs(X,Y) :- nonvar(X), is_SetVarArgs_(X,Y). | ||
|  | is_SetVarArgs(X) :- \+ \+ is_SetVarArgs(X,_). | ||
|  | 
 | ||
|  | is_IntArgs_([],[]). | ||
|  | is_IntArgs_([H|T],[H|T2]) :- integer(H), is_IntArgs(T,T2). | ||
|  | is_IntArgs(X,Y) :- nonvar(X), is_IntArgs_(X,Y). | ||
|  | is_IntArgs(X) :- \+ \+ is_IntArgs(X,_). | ||
|  | 
 | ||
|  | is_IntSharedArray(X) :- is_IntArgs(X). | ||
|  | is_IntSharedArray(X,Y) :- is_IntArgs(X,Y). | ||
|  | 
 | ||
|  | is_TaskTypeArgs_([],[]). | ||
|  | is_TaskTypeArgs_([H|T],[H2|T2]) :- is_TaskType(H,H2), is_TaskTypeArgs(T,T2). | ||
|  | is_TaskTypeArgs(X,Y) :- nonvar(X), is_TaskTypeArgs_(X,Y). | ||
|  | is_TaskTypeArgs(X) :- \+ \+ is_TaskTypeArgs(X,_). | ||
|  | 
 | ||
|  | is_IntSet_('IntSet'(L),L). | ||
|  | is_IntSet(X,Y) :- nonvar(X), is_IntSet_(X,Y). | ||
|  | is_IntSet(X) :- is_IntSet(X,_). | ||
|  | 
 | ||
|  | is_IntSetArgs_([],[]). | ||
|  | is_IntSetArgs_([H|T],[H2|T2]) :- is_IntSet(H,H2), is_IntSetArgs(T,T2). | ||
|  | is_IntSetArgs(X,Y) :- nonvar(X), is_IntSetArgs_(X,Y). | ||
|  | is_IntSetArgs(X) :- \+ \+ is_IntSetArgs(X,_). | ||
|  | 
 | ||
|  | new_intset(X,I,J) :- intset(X,I,J). | ||
|  | new_intset(X,L) :- intset(X,L). | ||
|  | 
 | ||
|  | intset(X, I, J) :- | ||
|  | 	integer(I), | ||
|  | 	integer(J), | ||
|  | 	X='IntSet'([(I,J)]). | ||
|  | intset(X, L) :- | ||
|  | 	is_list_of_intset_specs(L,L2), | ||
|  | 	X='IntSet'(L2). | ||
|  | 
 | ||
|  | is_list_of_intset_specs(X,Y) :- | ||
|  | 	nonvar(X), is_list_of_intset_specs_(X,Y). | ||
|  | is_list_of_intset_specs_([],[]). | ||
|  | is_list_of_intset_specs_([H|T],[H2|T2]) :- | ||
|  | 	is_intset_spec(H,H2), | ||
|  | 	is_list_of_intset_specs(T,T2). | ||
|  | 
 | ||
|  | is_intset_spec(X,Y) :- nonvar(X), is_intset_spec_(X,Y). | ||
|  | is_intset_spec_((I,J),(I,J)) :- !, integer(I), integer(J). | ||
|  | is_intset_spec_(I,(I,I)) :- integer(I). | ||
|  | 
 | ||
|  | assert_var(X,Y) :- | ||
|  | 	var(X) -> X=Y; throw(gecode_error(expected(var))). | ||
|  | assert_is_int(X,Y) :- | ||
|  | 	integer(X) -> X=Y ; throw(gecode_error(expected(int))). | ||
|  | assert_is_Space(X,Y) :- | ||
|  | 	is_Space(X,Y) -> true ; throw(gecode_error(expected(space))). | ||
|  | assert_is_IntSet(X,Y) :- | ||
|  | 	is_IntSet(X,Y) -> true ; throw(gecode_error(expected(intset))). | ||
|  | assert_is_IntVar(X,Y) :- | ||
|  | 	is_IntVar(X,Y) -> true ; throw(gecode_error(expected(intvar))). | ||
|  | assert_is_BoolVar(X,Y) :- | ||
|  | 	is_BoolVar(X,Y) -> true ; throw(gecode_error(expected(boolvar))). | ||
|  | assert_is_SetVar(X,Y) :- | ||
|  | 	is_SetVar(X,Y) -> true ; throw(gecode_error(expected(setvar))). | ||
|  | assert_is_IntArgs(X,Y) :- | ||
|  | 	is_IntArgs(X,Y) -> true ; throw(gecode_error(expected(intargs))). | ||
|  | assert_is_IntVarArgs(X,Y) :- | ||
|  | 	is_IntVarArgs(X,Y) -> true ; throw(gecode_error(expected(intvarargs))). | ||
|  | assert_is_BoolVarArgs(X,Y) :- | ||
|  | 	is_BoolVarArgs(X,Y) -> true ; throw(gecode_error(expected(boolvarargs))). | ||
|  | assert_is_SetVarArgs(X,Y) :- | ||
|  | 	is_SetVarArgs(X,Y) -> true ; throw(gecode_error(expected(setvarargs))). | ||
|  | 
 | ||
|  | assert_var(X) :- assert_var(X,_). | ||
|  | assert_is_int(X) :- assert_is_int(X,_). | ||
|  | assert_is_Space(X) :- assert_is_Space(X,_). | ||
|  | assert_is_IntSet(X) :- assert_is_IntSet(X,_). | ||
|  | assert_is_IntVar(X) :- assert_is_IntVar(X,_). | ||
|  | assert_is_BoolVar(X) :- assert_is_BoolVar(X,_). | ||
|  | assert_is_SetVar(X) :- assert_is_SetVar(X,_). | ||
|  | assert_is_IntArgs(X) :- assert_is_IntArgs(X,_). | ||
|  | assert_is_IntVarArgs(X) :- assert_is_IntVarArgs(X,_). | ||
|  | assert_is_BoolVarArgs(X) :- assert_is_BoolVarArgs(X,_). | ||
|  | assert_is_SetVarArgs(X) :- assert_is_SetVarArgs(X,_). | ||
|  | 
 | ||
|  | new_space(Space) :- | ||
|  | 	assert_var(Space), | ||
|  | 	gecode_new_space(Space_), | ||
|  | 	Space='Space'(Space_). | ||
|  | 
 | ||
|  | %% checking that an argument is a space sets a global variable | ||
|  | %% indicating whether variables need to be translated to their | ||
|  | %% original index or to their "keep" index. | ||
|  | %% | ||
|  | %% these bindings are going to take advantage of the fact that, | ||
|  | %% when a space is involved, it is checked first, thus setting | ||
|  | %% this global variable. subsequent accesses to variables are | ||
|  | %% then correctly translated. | ||
|  | 
 | ||
|  | is_Space_('Space'(X),X) :- | ||
|  |     gecode_space_use_keep_index(X,B), | ||
|  |     nb_setval(gecode_space_use_keep_index,B). | ||
|  | is_Space(X,Y) :- nonvar(X), is_Space_(X,Y). | ||
|  | is_Space(X) :- is_Space(X,_). | ||
|  | 
 | ||
|  | %% AUTOGENERATE ALL VARIANTS LATER! | ||
|  | 
 | ||
|  | new_intvars([], Space, Lo, Hi). | ||
|  | new_intvars([IVar|IVars], Space, Lo, Hi) :- | ||
|  | 	new_intvar(IVar, Space, Lo, Hi), | ||
|  | 	new_intvars(IVars, Space, Lo, Hi). | ||
|  | 
 | ||
|  | new_intvars([], Space, IntSet). | ||
|  | new_intvars([IVar|IVars], Space, IntSet) :- | ||
|  | 	new_intvar(IVar, Space, IntSet), | ||
|  | 	new_intvars(IVars, Space, IntSet). | ||
|  | 
 | ||
|  | new_boolvars([], Space). | ||
|  | new_boolvars([BVar|BVars], Space) :- | ||
|  | 	new_boolvar(BVar, Space), | ||
|  | 	new_boolvars(BVars, Space). | ||
|  | 
 | ||
|  | new_setvars([], Space, X1, X2, X3, X4, X5, X6). | ||
|  | new_setvars([SVar|SVars], Space, X1, X2, X3, X4, X5, X6) :- | ||
|  | 	new_setvar(SVar, Space, X1, X2, X3, X4, X5, X6), | ||
|  | 	new_setvars(SVars, Space, X1, X2, X3, X4, X5, X6). | ||
|  | 
 | ||
|  | new_setvars([], Space, X1, X2, X3, X4, X5). | ||
|  | new_setvars([SVar|SVars], Space, X1, X2, X3, X4, X5) :- | ||
|  | 	new_setvar(SVar, Space, X1, X2, X3, X4, X5), | ||
|  | 	new_setvars(SVars, Space, X1, X2, X3, X4, X5). | ||
|  | 
 | ||
|  | new_setvars([], Space, X1, X2, X3, X4). | ||
|  | new_setvars([SVar|SVars], Space, X1, X2, X3, X4) :- | ||
|  | 	new_setvar(SVar, Space, X1, X2, X3, X4), | ||
|  | 	new_setvars(SVars, Space, X1, X2, X3, X4). | ||
|  | 
 | ||
|  | new_setvars([], Space, X1, X2, X3). | ||
|  | new_setvars([SVar|SVars], Space, X1, X2, X3) :- | ||
|  | 	new_setvar(SVar, Space, X1, X2, X3), | ||
|  | 	new_setvars(SVars, Space, X1, X2, X3). | ||
|  | 
 | ||
|  | new_setvars([], Space, X1, X2). | ||
|  | new_setvars([SVar|SVars], Space, X1, X2) :- | ||
|  | 	new_setvar(SVar, Space, X1, X2), | ||
|  | 	new_setvars(SVars, Space, X1, X2). | ||
|  | 
 | ||
|  | %% AUTOGENERATE LATER | ||
|  | 
 | ||
|  | assert_integer(X) :- assert_is_int(X). | ||
|  | 
 | ||
|  | new_intvar(IVar, Space, Lo, Hi) :- !, | ||
|  | 	assert_var(IVar), | ||
|  | 	assert_is_Space_or_Clause(Space,Space_), | ||
|  | 	assert_integer(Lo), | ||
|  | 	assert_integer(Hi), | ||
|  | 	gecode_new_intvar_from_bounds(Idx,Space_,Lo,Hi), | ||
|  | 	IVar='IntVar'(Idx,-1). | ||
|  | new_intvar(IVar, Space, IntSet) :- !, | ||
|  | 	assert_var(IVar), | ||
|  | 	assert_is_Space_or_Clause(Space,Space_), | ||
|  | 	assert_is_IntSet(IntSet, L), | ||
|  | 	gecode_new_intvar_from_intset(Idx,Space_,L), | ||
|  | 	IVar='IntVar'(Idx,-1). | ||
|  | 
 | ||
|  | new_boolvar(BVar, Space) :- !, | ||
|  | 	assert_var(BVar), | ||
|  | 	assert_is_Space_or_Clause(Space,Space_), | ||
|  | 	gecode_new_boolvar(Idx,Space_), | ||
|  | 	BVar='BoolVar'(Idx,-1). | ||
|  | 
 | ||
|  | %% (GlbMin,GlbMax,LubMin,LubMax,CardMin,CardMax) 6 new_setvar_1 | ||
|  | %% (GlbMin,GlbMax,LubMin,LubMax,CardMin)         5 new_setvar_2 | ||
|  | %% (GlbMin,GlbMax,LubMin,LubMax)                 4 new_setvar_3 | ||
|  | %% (Glb,LubMin,LubMax,CardMin,CardMax)           5 new_setvar_4 | ||
|  | %% (Glb,LubMin,LubMax,CardMin)                   4 new_setvar_5 | ||
|  | %% (Glb,LubMin,LubMax)                           3 new_setvar_6 | ||
|  | %% (GlbMin,GlbMax,Lub,CardMin,CardMax)           5 new_setvar_7 | ||
|  | %% (GlbMin,GlbMax,Lub,CardMin)                   4 new_setvar_8 | ||
|  | %% (GlbMin,GlbMax,Lub)                           3 new_setvar_9 | ||
|  | %% (Glb,Lub,CardMin,CardMax)                     4 new_setvar_10 | ||
|  | %% (Glb,Lub,CardMin)                             3 new_setvar_11 | ||
|  | %% (Glb,Lub)                                     2 new_setvar_12 | ||
|  | 
 | ||
|  | %% 6 arguments | ||
|  | %% (GlbMin,GlbMax,LubMin,LubMax,CardMin,CardMax) 6 new_setvar_1 | ||
|  | new_setvar(SVar, Space, GlbMin, GlbMax, LubMin, LubMax, CardMin, CardMax) :- | ||
|  | 	assert_var(SVar), | ||
|  | 	assert_is_Space_or_Clause(Space,Space_), | ||
|  | 	assert_integer(GlbMin), | ||
|  | 	assert_integer(GlbMax), | ||
|  | 	assert_integer(LubMin), | ||
|  | 	assert_integer(LubMax), | ||
|  | 	assert_integer(CardMin), | ||
|  | 	assert_integer(CardMax), | ||
|  | 	gecode_new_setvar(Idx, Space_, GlbMin, GlbMax, LubMib, LubMax, CardMin, CardMax), | ||
|  | 	SVar='SetVar'(Idx,-1). | ||
|  | 
 | ||
|  | %% 5 arguments | ||
|  | %% (GlbMin,GlbMax,LubMin,LubMax,CardMin)         5 new_setvar_2 | ||
|  | %% (Glb,LubMin,LubMax,CardMin,CardMax)           5 new_setvar_4 | ||
|  | %% (GlbMin,GlbMax,Lub,CardMin,CardMax)           5 new_setvar_7 | ||
|  | new_setvar(SVar, Space, X1, X2, X3, X4, X5) :- | ||
|  | 	assert_var(SVar), | ||
|  | 	assert_is_Space_or_Clause(Space,Space_), | ||
|  | 	(integer(X1) | ||
|  | 	-> | ||
|  | 	 assert_integer(X2), | ||
|  | 	 assert_integer(X4), | ||
|  | 	 assert_integer(X5), | ||
|  | 	 (is_IntSet(X3,X3_) | ||
|  | 	 -> gecode_new_setvar_7(Idx,Space_,X1,X2,X3_,X4,X5) | ||
|  | 	 ;  gecode_new_setvar_2(Idx,Space_,X1,X2,X3,X4,X5)) | ||
|  | 	; | ||
|  | 	 assert_is_IntSet(X1,X1_), | ||
|  | 	 assert_integer(X2), | ||
|  | 	 assert_integer(X3), | ||
|  | 	 assert_integer(X4), | ||
|  | 	 assert_integer(X5), | ||
|  | 	 gecode_new_setvar_4(Idx,Space_,X1_,X2,X3,X4,X5)), | ||
|  | 	SVar='SetVar'(Idx,-1). | ||
|  | 
 | ||
|  | %% 4 arguments | ||
|  | %% (GlbMin,GlbMax,LubMin,LubMax)                 4 new_setvar_3 | ||
|  | %% (Glb,LubMin,LubMax,CardMin)                   4 new_setvar_5 | ||
|  | %% (GlbMin,GlbMax,Lub,CardMin)                   4 new_setvar_8 | ||
|  | %% (Glb,Lub,CardMin,CardMax)                     4 new_setvar_10 | ||
|  | new_setvar(SVar,Space,X1,X2,X3,X4) :- | ||
|  | 	assert_var(SVar), | ||
|  | 	assert_is_Space_or_Clause(Space,Space_), | ||
|  | 	assert_integer(X4), | ||
|  | 	(is_IntSet(X1,X1_) | ||
|  | 	-> (is_IntSet(X2,X2_) | ||
|  | 	   -> | ||
|  | 	    assert_integer(X3), | ||
|  | 	    gecode_new_setvar_10(Idx,Space_,X1_,X2_,X3,X4) | ||
|  | 	   ; | ||
|  | 	    assert_integer(X2), | ||
|  | 	    assert_integer(X3), | ||
|  | 	    gecode_new_setvar_5(Idx,Space_,X1_,X2,X3,X4)) | ||
|  | 	; | ||
|  | 	 assert_integer(X1), | ||
|  | 	 assert_integer(X2), | ||
|  | 	 (is_IntSet(X3,X3_) | ||
|  | 	 -> | ||
|  | 	  gecode_new_setvar_8(Idx,Space_,X1,X2,X3_,X4) | ||
|  | 	 ; | ||
|  | 	  assert_integer(X3), | ||
|  | 	  gecode_new_setvar_3(Idx,Space_,X1,X2,X3,X4))), | ||
|  | 	SVar='SetVar'(Idx,-1). | ||
|  | 
 | ||
|  | %% 3 arguments | ||
|  | %% (Glb,LubMin,LubMax)                           3 new_setvar_6 | ||
|  | %% (GlbMin,GlbMax,Lub)                           3 new_setvar_9 | ||
|  | %% (Glb,Lub,CardMin)                             3 new_setvar_11 | ||
|  | new_setvar(SVar,Space,X1,X2,X3) :- | ||
|  | 	assert_var(SVar), | ||
|  | 	assert_is_Space_or_Clause(Space,Space_), | ||
|  | 	(is_IntSet(X1,X1_) | ||
|  | 	-> (is_IntSet(X2,X2_) | ||
|  | 	   -> | ||
|  | 	    assert_integer(X3), | ||
|  | 	    gecode_new_setvar_11(Idx,Space_,X1_,X2_,X3) | ||
|  | 	   ; | ||
|  | 	    assert_integer(X2), | ||
|  | 	    assert_integer(X3), | ||
|  | 	    gecode_new_setvar_6(Idx,Space_,X1_,X2,X3)) | ||
|  | 	; | ||
|  | 	 assert_integer(X1), | ||
|  | 	 assert_integer(X2), | ||
|  | 	 assert_is_IntSet(X3,X3_), | ||
|  | 	 gecode_new_setvar_9(Idx,Space_,X1,X2,X3_)), | ||
|  | 	SVar='SetVar'(Idx,-1). | ||
|  | 
 | ||
|  | %% 2 arguments | ||
|  | %% (Glb,Lub)                                     2 new_setvar_12 | ||
|  | new_setvar(SVar,Space,X1,X2) :- | ||
|  | 	assert_var(SVar), | ||
|  | 	assert_is_Space_or_Clause(Space,Space_), | ||
|  | 	assert_is_IntSet(X1,X1_), | ||
|  | 	assert_is_IntSet(X2,X2_), | ||
|  | 	gecode_new_setvar_12(Idx,Space_,X1_,X2_), | ||
|  | 	SVar='SetVar'(Idx,-1). | ||
|  | 
 | ||
|  | minimize(Space,IVar) :- | ||
|  | 	assert_is_Space(Space,Space_), | ||
|  | 	assert_is_IntVar(IVar,IVar_), | ||
|  | 	gecode_space_minimize(Space_,IVar_). | ||
|  | maximize(Space,IVar) :- | ||
|  | 	assert_is_Space(Space,Space_), | ||
|  | 	assert_is_IntVar(IVar,IVar_), | ||
|  | 	gecode_space_maximize(Space_,IVar_). | ||
|  | minimize(Space,IVar1,IVar2) :- | ||
|  | 	assert_is_Space(Space,Space_), | ||
|  | 	assert_is_IntVar(IVar1,IVar1_), | ||
|  | 	assert_is_IntVar(IVar2,IVar2_), | ||
|  | 	gecode_space_minimize_ratio(Space_,IVar1_,IVar2_). | ||
|  | maximize(Space,IVar1,IVar2) :- | ||
|  | 	assert_is_Space(Space,Space_), | ||
|  | 	assert_is_IntVar(IVar1,IVar1_), | ||
|  | 	assert_is_IntVar(IVar2,IVar2_), | ||
|  | 	gecode_space_maximize_ratio(Space_,IVar1_,IVar2_). | ||
|  | 
 | ||
|  | gecode_search_options_init(search_options(0,1.0,8,2)). | ||
|  | gecode_search_options_offset(restart,1). | ||
|  | gecode_search_options_offset(threads,2). | ||
|  | gecode_search_options_offset(c_d    ,3). | ||
|  | gecode_search_options_offset(a_d    ,4). | ||
|  | 
 | ||
|  | gecode_search_option_set(O,V,R) :- | ||
|  |     gecode_search_options_offset(O,I), | ||
|  |     setarg(I,R,V). | ||
|  | 
 | ||
|  | gecode_search_options_from_alist(L,R) :- | ||
|  |     gecode_search_options_init(R), | ||
|  |     gecode_search_options_process_alist(L,R). | ||
|  | 
 | ||
|  | gecode_search_options_process_alist([],R). | ||
|  | gecode_search_options_process_alist([H|T],R) :- !, | ||
|  |     gecode_search_options_process1(H,R), | ||
|  |     gecode_search_options_process_alist(T,R). | ||
|  | 
 | ||
|  | gecode_search_options_process1(restart,R) :- !, | ||
|  |     gecode_search_option_set(restart,1,R). | ||
|  | gecode_search_options_process1(threads=N,R) :- !, | ||
|  |     (integer(N) -> V is float(N) | ||
|  |     ; (float(N) -> V=N | ||
|  |       ; throw(bad_search_option_value(threads=N)))), | ||
|  |     gecode_search_option_set(threads,V,R). | ||
|  | gecode_search_options_process1(c_d=N,R) :- !, | ||
|  |     (integer(N) -> V=N | ||
|  |     ; throw(bad_search_option_value(c_d=N))), | ||
|  |     gecode_search_option_set(c_d,V,R). | ||
|  | gecode_search_options_process1(a_d=N,R) :- !, | ||
|  |     (integer(N) -> V=N | ||
|  |     ; throw(bad_search_option_value(a_d=N))), | ||
|  |     gecode_search_option_set(a_d,V,R). | ||
|  | gecode_search_options_process1(O,_) :- | ||
|  |     throw(gecode_error(unrecognized_search_option(O))). | ||
|  | 
 | ||
|  | search(Space, Solution) :- | ||
|  |     search(Space, Solution, []). | ||
|  | 
 | ||
|  | search(Space, Solution, Alist) :- | ||
|  | 	assert_is_Space(Space,Space_), | ||
|  | 	assert_var(Solution), | ||
|  | 	gecode_search_options_from_alist(Alist,O), | ||
|  | 	gecode_new_engine(Space_,Engine_,O), | ||
|  | 	gecode_engine_search(Engine_,Solution_), | ||
|  | 	Solution='Space'(Solution_). | ||
|  | 
 | ||
|  | 
 | ||
|  | %% INSPECTING VARIABLES | ||
|  | 
 | ||
|  | get_for_vars([],Space,[],F). | ||
|  | get_for_vars([V|Vs],Space,[V2|V2s],F) :- | ||
|  | 	call_with_args(F,V,Space,V2), | ||
|  | 	get_for_vars(Vs,Space,V2s,F). | ||
|  | 
 | ||
|  | get_assigned(Space, Var) :- | ||
|  | 	assert_is_Space(Space,Space_), | ||
|  | 	(is_IntVar(Var,Var_) | ||
|  | 	-> gecode_intvar_assigned(Space_,Var_) | ||
|  | 	; is_BoolVar(Var,Var_) | ||
|  | 	-> gecode_boolvar_assigned(Space_,Var_) | ||
|  | 	; is_SetVar(Var,Var_) | ||
|  | 	-> gecode_setvar_assigned(Space_,Var_) | ||
|  | 	; throw(gecode_error(expected(variable)))). | ||
|  | 
 | ||
|  | get_min(X, Space, Var) :- | ||
|  | 	assert_is_Space(Space,Space_), | ||
|  | 	(is_IntVar(Var,Var_) | ||
|  | 	-> gecode_intvar_min(X, Space_, Var_) | ||
|  | 	; is_BoolVar(Var,Var_) | ||
|  | 	-> gecode_boolvar_min(X, Space_, Var_) | ||
|  | 	; get_for_vars(X, Space, Var, gecode:get_min)). | ||
|  | 
 | ||
|  | get_max(X, Space, Var) :- | ||
|  | 	assert_is_Space(Space,Space_), | ||
|  | 	(is_IntVar(Var,Var_) | ||
|  | 	-> gecode_intvar_max(X, Space_, Var_) | ||
|  | 	; is_BoolVar(Var,Var_) | ||
|  | 	-> gecode_boolvar_max(X, Space_, Var_) | ||
|  | 	; get_for_vars(X, Space, Var, gecode:get_max)). | ||
|  | 
 | ||
|  | get_med(X, Space, Var) :- | ||
|  | 	assert_is_Space(Space,Space_), | ||
|  | 	(is_IntVar(Var,Var_) | ||
|  | 	-> gecode_intvar_med(X, Space_, Var_) | ||
|  | 	; is_BoolVar(Var,Var_) | ||
|  | 	-> gecode_boolvar_med(X, Space_, Var_) | ||
|  | 	; get_for_vars(X, Space, Var, gecode:get_med)). | ||
|  | 
 | ||
|  | get_val(X, Space, Var) :- | ||
|  | 	assert_is_Space(Space,Space_), | ||
|  | 	(is_IntVar(Var,Var_) | ||
|  | 	-> gecode_intvar_val(X, Space_, Var_) | ||
|  | 	; is_BoolVar(Var,Var_) | ||
|  | 	-> gecode_boolvar_val(X, Space_, Var_) | ||
|  | 	; get_for_vars(X, Space, Var, gecode:get_val)). | ||
|  | 
 | ||
|  | get_size(X, Space, Var) :- | ||
|  | 	assert_is_Space(Space,Space_), | ||
|  | 	(is_IntVar(Var,Var_) | ||
|  | 	-> gecode_intvar_size(X, Space_, Var_) | ||
|  | 	; is_BoolVar(Var,Var_) | ||
|  | 	-> gecode_boolvar_size(X, Space_, Var_) | ||
|  | 	; get_for_vars(X, Space, Var, gecode:get_size)). | ||
|  | 
 | ||
|  | get_width(X, Space, Var) :- | ||
|  | 	assert_is_Space(Space,Space_), | ||
|  | 	(is_IntVar(Var,Var_) | ||
|  | 	-> gecode_intvar_width(X, Space_, Var_) | ||
|  | 	; is_BoolVar(Var,Var_) | ||
|  | 	-> gecode_boolvar_width(X, Space_, Var_) | ||
|  | 	; get_for_vars(X, Space, Var, gecode:get_width)). | ||
|  | 
 | ||
|  | get_regret_min(X, Space, Var) :- | ||
|  | 	assert_is_Space(Space,Space_), | ||
|  | 	(is_IntVar(Var,Var_) | ||
|  | 	-> gecode_intvar_regret_min(X, Space_, Var_) | ||
|  | 	; is_BoolVar(Var,Var_) | ||
|  | 	-> gecode_boolvar_regret_min(X, Space_, Var_) | ||
|  | 	; get_for_vars(X, Space, Var, gecode:get_regret_min)). | ||
|  | 
 | ||
|  | get_regret_max(X, Space, Var) :- | ||
|  | 	assert_is_Space(Space,Space_), | ||
|  | 	(is_IntVar(Var,Var_) | ||
|  | 	-> gecode_intvar_regret_max(X, Space_, Var_) | ||
|  | 	; is_BoolVar(Var,Var_) | ||
|  | 	-> gecode_boolvar_regret_max(X, Space_, Var_) | ||
|  | 	; get_for_vars(X, Space, Var, gecode:get_regret_max)). | ||
|  | 
 | ||
|  | get_glbSize(X, Space, Var) :- | ||
|  | 	assert_is_Space(Space,Space_), | ||
|  | 	(is_SetVar(Var,Var_) | ||
|  | 	-> gecode_setvar_glbSize(X,Space_,Var_) | ||
|  | 	; get_for_vars(X, Space, Var, gecode:get_glbSize)). | ||
|  | 
 | ||
|  | get_lubSize(X, Space, Var) :- | ||
|  | 	assert_is_Space(Space,Space_), | ||
|  | 	(is_SetVar(Var,Var_) | ||
|  | 	-> gecode_setvar_lubSize(X,Space_,Var_) | ||
|  | 	; get_for_vars(X, Space, Var, gecode:get_lubSize)). | ||
|  | 
 | ||
|  | get_unknownSize(X, Space, Var) :- | ||
|  | 	assert_is_Space(Space,Space_), | ||
|  | 	(is_SetVar(Var,Var_) | ||
|  | 	-> gecode_setvar_unknownSize(X,Space_,Var_) | ||
|  | 	; get_for_vars(X, Space, Var, gecode:get_unknownSize)). | ||
|  | 
 | ||
|  | get_cardMin(X, Space, Var) :- | ||
|  | 	assert_is_Space(Space,Space_), | ||
|  | 	(is_SetVar(Var,Var_) | ||
|  | 	-> gecode_setvar_cardMin(X,Space_,Var_) | ||
|  | 	; get_for_vars(X, Space, Var, gecode:get_cardMin)). | ||
|  | 
 | ||
|  | get_cardMax(X, Space, Var) :- | ||
|  | 	assert_is_Space(Space,Space_), | ||
|  | 	(is_SetVar(Var,Var_) | ||
|  | 	-> gecode_setvar_cardMax(X,Space_,Var_) | ||
|  | 	; get_for_vars(X, Space, Var, gecode:get_cardMax)). | ||
|  | 
 | ||
|  | get_lubMin(X, Space, Var) :- | ||
|  | 	assert_is_Space(Space,Space_), | ||
|  | 	(is_SetVar(Var,Var_) | ||
|  | 	-> gecode_setvar_lubMin(X,Space_,Var_) | ||
|  | 	; get_for_vars(X, Space, Var, gecode:get_lubMin)). | ||
|  | 
 | ||
|  | get_lubMax(X, Space, Var) :- | ||
|  | 	assert_is_Space(Space,Space_), | ||
|  | 	(is_SetVar(Var,Var_) | ||
|  | 	-> gecode_setvar_lubMax(X,Space_,Var_) | ||
|  | 	; get_for_vars(X, Space, Var, gecode:get_lubMax)). | ||
|  | 
 | ||
|  | get_glbMin(X, Space, Var) :- | ||
|  | 	assert_is_Space(Space,Space_), | ||
|  | 	(is_SetVar(Var,Var_) | ||
|  | 	-> gecode_setvar_glbMin(X,Space_,Var_) | ||
|  | 	; get_for_vars(X, Space, Var, gecode:get_glbMin)). | ||
|  | 
 | ||
|  | get_glbMax(X, Space, Var) :- | ||
|  | 	assert_is_Space(Space,Space_), | ||
|  | 	(is_SetVar(Var,Var_) | ||
|  | 	-> gecode_setvar_glbMax(X,Space_,Var_) | ||
|  | 	; get_for_vars(X, Space, Var, gecode:get_glbMax)). | ||
|  | 
 | ||
|  | get_glb_ranges(X, Space, Var) :- | ||
|  | 	assert_is_Space(Space,Space_), | ||
|  | 	(is_SetVar(Var,Var_) | ||
|  | 	-> gecode_setvar_glb_ranges(X,Space_,Var_) | ||
|  | 	; get_for_vars(X,Space,Var,gecode:get_glb_ranges)). | ||
|  | 
 | ||
|  | get_lub_ranges(X, Space, Var) :- | ||
|  | 	assert_is_Space(Space,Space_), | ||
|  | 	(is_SetVar(Var,Var_) | ||
|  | 	-> gecode_setvar_lub_ranges(X,Space_,Var_) | ||
|  | 	; get_for_vars(X,Space,Var,gecode:get_lub_ranges)). | ||
|  | 
 | ||
|  | get_unknown_ranges(X, Space, Var) :- | ||
|  | 	assert_is_Space(Space,Space_), | ||
|  | 	(is_SetVar(Var,Var_) | ||
|  | 	-> gecode_setvar_unknown_ranges(X,Space_,Var_) | ||
|  | 	; get_for_vars(X,Space,Var,gecode:get_unknown_ranges)). | ||
|  | 
 | ||
|  | get_glb_values(X, Space, Var) :- | ||
|  | 	assert_is_Space(Space,Space_), | ||
|  | 	(is_SetVar(Var,Var_) | ||
|  | 	-> gecode_setvar_glb_values(X,Space_,Var_) | ||
|  | 	; get_for_vars(X,Space,Var,gecode:get_glb_values)). | ||
|  | 
 | ||
|  | get_lub_values(X, Space, Var) :- | ||
|  | 	assert_is_Space(Space,Space_), | ||
|  | 	(is_SetVar(Var,Var_) | ||
|  | 	-> gecode_setvar_lub_values(X,Space_,Var_) | ||
|  | 	; get_for_vars(X,Space,Var,gecode:get_lub_values)). | ||
|  | 
 | ||
|  | get_unknown_values(X, Space, Var) :- | ||
|  | 	assert_is_Space(Space,Space_), | ||
|  | 	(is_SetVar(Var,Var_) | ||
|  | 	-> gecode_setvar_unknown_values(X,Space_,Var_) | ||
|  | 	; get_for_vars(X,Space,Var,gecode:get_unknown_values)). | ||
|  | 
 | ||
|  | get_ranges(X, Space, Var) :- | ||
|  | 	assert_is_Space(Space,Space_), | ||
|  | 	(is_IntVar(Var,Var_) | ||
|  | 	-> gecode_intvar_ranges(X,Space_,Var_) | ||
|  | 	; get_for_vars(X,Space,Var,gecode:get_ranges)). | ||
|  | 
 | ||
|  | get_values(X, Space, Var) :- | ||
|  | 	assert_is_Space(Space,Space_), | ||
|  | 	(is_IntVar(Var,Var_) | ||
|  | 	-> gecode_intvar_values(X,Space_,Var_) | ||
|  | 	; get_for_vars(X,Space,Var,gecode:get_values)). | ||
|  | 
 | ||
|  | new_disjunctor(X, Space) :- | ||
|  | 	assert_is_Space(Space,Space_), | ||
|  | 	gecode_new_disjunctor(D,Space_), | ||
|  | 	X='Disjunctor'(D). | ||
|  | 
 | ||
|  | is_Disjunctor_('Disjunctor'(D),D). | ||
|  | is_Disjunctor(X,Y) :- nonvar(X), is_Disjunctor_(X,Y). | ||
|  | is_Disjunctor(X) :- is_Disjunctor(X,_). | ||
|  | 
 | ||
|  | assert_is_Disjunctor(X,Y) :- | ||
|  | 	is_Disjunctor(X,Y) -> true ; throw(gecode_error(expected(disjunctor))). | ||
|  | 
 | ||
|  | new_clause(X, Disj) :- | ||
|  | 	assert_is_Disjunctor(Disj,Disj_), | ||
|  | 	gecode_new_clause(C, Disj_), | ||
|  | 	X='Clause'(C). | ||
|  | 
 | ||
|  | is_Clause_('Clause'(C),C) :- | ||
|  |     gecode_space_use_keep_index(C,B), | ||
|  |     nb_setval(gecode_space_use_keep_index,B). | ||
|  | is_Clause(X,Y) :- nonvar(X), is_Clause_(X,Y). | ||
|  | is_Clause(X) :- is_Clause(X,_). | ||
|  | 
 | ||
|  | assert_is_Clause(X,Y) :- | ||
|  | 	is_Clause(X,Y) -> true ; throw(gecode_error(expected(clause))). | ||
|  | 
 | ||
|  | is_Space_or_Clause(X,Y) :- | ||
|  | 	(is_Space(X,Y);is_Clause(X,Y)), !. | ||
|  | assert_is_Space_or_Clause(X,Y) :- | ||
|  | 	is_Space_or_Clause(X,Y)	-> true | ||
|  | 	; throw(gecode_error(expected(space,clause))). | ||
|  | 
 | ||
|  | new_forward(Clause, X, Y) :- | ||
|  | 	assert_is_Clause(Clause, Clause_), | ||
|  | 	(is_IntVar(X,X_) | ||
|  | 	-> (is_IntVar(Y,Y_) | ||
|  | 	   -> gecode_clause_intvar_forward(Clause_,X_,Y_) | ||
|  | 	   ; throw(gecode_error(forward))) | ||
|  | 	; (is_BoolVar(X,X_) | ||
|  | 	  -> (is_BoolVar(Y,Y_) | ||
|  | 	     -> gecode_clause_boolvar_forward(Clause_,X_,Y_) | ||
|  | 	     ; throw(gecode_error(forward))) | ||
|  | 	  ; (is_SetVar(X,X_) | ||
|  | 	    -> (is_SetVar(Y,Y_) | ||
|  | 	       -> gecode_clause_setvar_forward(Clause_,X_,Y_) | ||
|  | 	       ; throw(gecode_error(forward))) | ||
|  | 	    ; (X=[] | ||
|  | 	      -> Y=[] | ||
|  | 	      ;(X=[H1|T1],Y=[H2|T2]) | ||
|  | 	      -> (new_forward(Clause,H1,H2), | ||
|  | 		  new_forward(Clause,T1,T2)) | ||
|  | 	      ; throw(gecode_error(forward)))))). | ||
|  | 
 | ||
|  | new_intvars_(L,Space,N,I,J) :- length(L,N), new_intvars(L,Space,I,J). | ||
|  | new_intvars_(L,Space,N,IntSet) :- length(L,N), new_intvars(L,Space,IntSet). | ||
|  | new_boolvars_(L,Space,N) :- length(L,N), new_boolvars(L,Space). | ||
|  | new_setvars_(L,Space,N,X1,X2,X3,X4,X5,X6) :- length(L,N), new_setvars(L,Space,X1,X2,X3,X4,X5,X6). | ||
|  | new_setvars_(L,Space,N,X1,X2,X3,X4,X5) :- length(L,N), new_setvars(L,Space,X1,X2,X3,X4,X5). | ||
|  | new_setvars_(L,Space,N,X1,X2,X3,X4) :- length(L,N), new_setvars(L,Space,X1,X2,X3,X4). | ||
|  | new_setvars_(L,Space,N,X1,X2,X3) :- length(L,N), new_setvars(L,Space,X1,X2,X3). | ||
|  | new_setvars_(L,Space,N,X1,X2) :- length(L,N), new_setvars(L,Space,X1,X2). | ||
|  | 
 | ||
|  | keep_(Space, Var) :- | ||
|  |     (Var = 'IntVar'(I,J) | ||
|  |     -> (J = -1 -> (gecode_intvar_keep(Space,I,K),setarg(2,Var,K)) | ||
|  |        ; throw(gecode_error(variable_already_kept(Var)))) | ||
|  |     ; (Var = 'BoolVar'(I,J) | ||
|  |       -> (J = -1 -> (gecode_boolvar_keep(Space,I,K),setarg(2,Var,K)) | ||
|  | 	 ; throw(gecode_error(variable_already_kept(Var)))) | ||
|  |       ; (Var = 'SetVar'(I,J) | ||
|  | 	-> (J = -1 -> (gecode_setvar_keep(Space,I,K),setarg(2,Var,K)) | ||
|  | 	   ; throw(gecode_error(variable_already_kept(Var)))) | ||
|  | 	; keep_list_(Space,Var)))). | ||
|  | 
 | ||
|  | keep_list_(Space, []) :- !. | ||
|  | keep_list_(Space, [H|T]) :- !, | ||
|  |     keep_(Space,H), keep_list_(Space,T). | ||
|  | keep_list_(_, X) :- | ||
|  |     throw(gecode_error(not_a_variable(X))). | ||
|  | 
 | ||
|  | %% more concise interface: | ||
|  | (X := Y) :- var(Y), !, throw(gecode_error((X := Y))). | ||
|  | (X := intset(I,J)) :- !, new_intset(X,I,J). | ||
|  | (X := intset(L)) :- !, new_intset(X,L). | ||
|  | (X := space) :- !, new_space(X). | ||
|  | (X := intvar(Space,I,J)) :- !, new_intvar(X,Space,I,J). | ||
|  | (X := intvar(Space,IntSet)) :- !, new_intvar(X,Space,IntSet). | ||
|  | (X := boolvar(Space)) :- !, new_boolvar(X,Space). | ||
|  | (X := setvar(Space,X1,X2,X3,X4,X5,X6)) :- !, new_setvar(X,Space,X1,X2,X3,X4,X5,X6). | ||
|  | (X := setvar(Space,X1,X2,X3,X4,X5)) :- !, new_setvar(X,Space,X1,X2,X3,X4,X5). | ||
|  | (X := setvar(Space,X1,X2,X3,X4)) :- !, new_setvar(X,Space,X1,X2,X3,X4). | ||
|  | (X := setvar(Space,X1,X2,X3)) :- !, new_setvar(X,Space,X1,X2,X3). | ||
|  | (X := setvar(Space,X1,X2)) :- !, new_setvar(X,Space,X1,X2). | ||
|  | (X := intvars(Space,N,I,J)) :- !, new_intvars_(X,Space,N,I,J). | ||
|  | (X := intvars(Space,N,IntSet)) :- !, new_intvars_(X,Space,N,IntSet). | ||
|  | (X := boolvars(Space,N)) :- !, new_boolvars_(X,Space,N). | ||
|  | (X := setvars(Space,N,X1,X2,X3,X4,X5,X6)) :- !, new_setvars_(X,Space,N,X1,X2,X3,X4,X5,X6). | ||
|  | (X := setvars(Space,N,X1,X2,X3,X4,X5)) :- !, new_setvars_(X,Space,N,X1,X2,X3,X4,X5). | ||
|  | (X := setvars(Space,N,X1,X2,X3,X4)) :- !, new_setvars_(X,Space,N,X1,X2,X3,X4). | ||
|  | (X := setvars(Space,N,X1,X2,X3)) :- !, new_setvars_(X,Space,N,X1,X2,X3). | ||
|  | (X := setvars(Space,N,X1,X2)) :- !, new_setvars_(X,Space,N,X1,X2). | ||
|  | 
 | ||
|  | (X := min(Space,Var)) :- !, get_min(X,Space,Var). | ||
|  | (X := max(Space,Var)) :- !, get_max(X,Space,Var). | ||
|  | (X := med(Space,Var)) :- !, get_med(X,Space,Var). | ||
|  | (X := val(Space,Var)) :- !, get_val(X,Space,Var). | ||
|  | (X := size(Space,Var)) :- !, get_size(X,Space,Var). | ||
|  | (X := width(Space,Var)) :- !, get_width(X,Space,Var). | ||
|  | (X := regret_min(Space,Var)) :- !, get_regret_min(X,Space,Var). | ||
|  | (X := regret_max(Space,Var)) :- !, get_regret_max(X,Space,Var). | ||
|  | (X := ranges(Space,Var)) :- !, get_ranges(X,Space,Var). | ||
|  | (X := values(Space,Var)) :- !, get_values(X,Space,Var). | ||
|  | 
 | ||
|  | (X := glbSize(Space,Var)) :- !, get_glbSize(X,Space,Var). | ||
|  | (X := lubSize(Space,Var)) :- !, get_lubSize(X,Space,Var). | ||
|  | (X := unknownSize(Space,Var)) :- !, get_unknownSize(X,Space,Var). | ||
|  | (X := cardMin(Space,Var)) :- !, get_cardMin(X,Space,Var). | ||
|  | (X := cardMax(Space,Var)) :- !, get_cardMax(X,Space,Var). | ||
|  | (X := lubMin(Space,Var)) :- !, get_lubMin(X,Space,Var). | ||
|  | (X := lubMax(Space,Var)) :- !, get_lubMax(X,Space,Var). | ||
|  | (X := glbMin(Space,Var)) :- !, get_glbMin(X,Space,Var). | ||
|  | (X := glbMax(Space,Var)) :- !, get_glbMax(X,Space,Var). | ||
|  | (X := glb_ranges(Space,Var)) :- !, get_glb_ranges(X,Space,Var). | ||
|  | (X := lub_ranges(Space,Var)) :- !, get_lub_ranges(X,Space,Var). | ||
|  | (X := unknown_ranges(Space,Var)) :- !, get_unknown_ranges(X,Space,Var). | ||
|  | (X := glb_values(Space,Var)) :- !, get_glb_values(X,Space,Var). | ||
|  | (X := lub_values(Space,Var)) :- !, get_lub_values(X,Space,Var). | ||
|  | (X := unknown_values(Space,Var)) :- !, get_unknown_values(X,Space,Var). | ||
|  | 
 | ||
|  | (X := disjunctor(Space)) :- !, new_disjunctor(X,Space). | ||
|  | (X := clause(Disj)) :- !, new_clause(X,Disj). | ||
|  | 
 | ||
|  | (X := search(Y)) :- !, search(Y,X). | ||
|  | (X := search(Y,L)) :- !, search(Y,X,L). | ||
|  | 
 | ||
|  | % these should be autogenerated: | ||
|  | (C += forward(X,Y)) :- !, new_forward(C,X,Y). | ||
|  | (Space += abs(X1,X2)) :- !, abs(Space,X1,X2). | ||
|  | (Space += abs(X1,X2,X3)) :- !, abs(Space,X1,X2,X3). | ||
|  | (Space += assign(X1,X2)) :- !, assign(Space,X1,X2). | ||
|  | (Space += atmostOne(X1,X2)) :- !, atmostOne(Space,X1,X2). | ||
|  | (Space += binpacking(X1,X2,X3)) :- !, binpacking(Space,X1,X2,X3). | ||
|  | (Space += binpacking(X1,X2,X3,X4)) :- !, binpacking(Space,X1,X2,X3,X4). | ||
|  | (Space += branch(X1,X2)) :- !, branch(Space,X1,X2). | ||
|  | (Space += branch(X1,X2,X3)) :- !, branch(Space,X1,X2,X3). | ||
|  | (Space += cardinality(X1,X2)) :- !, cardinality(Space,X1,X2). | ||
|  | (Space += cardinality(X1,X2,X3)) :- !, cardinality(Space,X1,X2,X3). | ||
|  | (Space += channel(X1,X2)) :- !, channel(Space,X1,X2). | ||
|  | (Space += channel(X1,X2,X3)) :- !, channel(Space,X1,X2,X3). | ||
|  | (Space += channel(X1,X2,X3,X4)) :- !, channel(Space,X1,X2,X3,X4). | ||
|  | (Space += channel(X1,X2,X3,X4,X5)) :- !, channel(Space,X1,X2,X3,X4,X5). | ||
|  | (Space += channelSorted(X1,X2)) :- !, channelSorted(Space,X1,X2). | ||
|  | (Space += circuit(X1)) :- !, circuit(Space,X1). | ||
|  | (Space += circuit(X1,X2)) :- !, circuit(Space,X1,X2). | ||
|  | (Space += circuit(X1,X2,X3)) :- !, circuit(Space,X1,X2,X3). | ||
|  | (Space += circuit(X1,X2,X3,X4)) :- !, circuit(Space,X1,X2,X3,X4). | ||
|  | (Space += circuit(X1,X2,X3,X4,X5)) :- !, circuit(Space,X1,X2,X3,X4,X5). | ||
|  | (Space += circuit(X1,X2,X3,X4,X5,X6)) :- !, circuit(Space,X1,X2,X3,X4,X5,X6). | ||
|  | (Space += clause(X1,X2,X3,X4)) :- !, clause(Space,X1,X2,X3,X4). | ||
|  | (Space += clause(X1,X2,X3,X4,X5)) :- !, clause(Space,X1,X2,X3,X4,X5). | ||
|  | (Space += convex(X1)) :- !, convex(Space,X1). | ||
|  | (Space += convex(X1,X2)) :- !, convex(Space,X1,X2). | ||
|  | (Space += count(X1,X2)) :- !, count(Space,X1,X2). | ||
|  | (Space += count(X1,X2,X3)) :- !, count(Space,X1,X2,X3). | ||
|  | (Space += count(X1,X2,X3,X4)) :- !, count(Space,X1,X2,X3,X4). | ||
|  | (Space += count(X1,X2,X3,X4,X5)) :- !, count(Space,X1,X2,X3,X4,X5). | ||
|  | (Space += cumulative(X1,X2,X3,X4)) :- !, cumulative(Space,X1,X2,X3,X4). | ||
|  | (Space += cumulative(X1,X2,X3,X4,X5)) :- !, cumulative(Space,X1,X2,X3,X4,X5). | ||
|  | (Space += cumulative(X1,X2,X3,X4,X5,X6)) :- !, cumulative(Space,X1,X2,X3,X4,X5,X6). | ||
|  | (Space += cumulative(X1,X2,X3,X4,X5,X6,X7)) :- !, cumulative(Space,X1,X2,X3,X4,X5,X6,X7). | ||
|  | (Space += cumulatives(X1,X2,X3,X4,X5,X6,X7)) :- !, cumulatives(Space,X1,X2,X3,X4,X5,X6,X7). | ||
|  | (Space += cumulatives(X1,X2,X3,X4,X5,X6,X7,X8)) :- !, cumulatives(Space,X1,X2,X3,X4,X5,X6,X7,X8). | ||
|  | (Space += distinct(X1)) :- !, distinct(Space,X1). | ||
|  | (Space += distinct(X1,X2)) :- !, distinct(Space,X1,X2). | ||
|  | (Space += distinct(X1,X2,X3)) :- !, distinct(Space,X1,X2,X3). | ||
|  | (Space += div(X1,X2,X3)) :- !, div(Space,X1,X2,X3). | ||
|  | (Space += div(X1,X2,X3,X4)) :- !, div(Space,X1,X2,X3,X4). | ||
|  | (Space += divmod(X1,X2,X3,X4)) :- !, divmod(Space,X1,X2,X3,X4). | ||
|  | (Space += divmod(X1,X2,X3,X4,X5)) :- !, divmod(Space,X1,X2,X3,X4,X5). | ||
|  | (Space += dom(X1,X2)) :- !, dom(Space,X1,X2). | ||
|  | (Space += dom(X1,X2,X3)) :- !, dom(Space,X1,X2,X3). | ||
|  | (Space += dom(X1,X2,X3,X4)) :- !, dom(Space,X1,X2,X3,X4). | ||
|  | (Space += dom(X1,X2,X3,X4,X5)) :- !, dom(Space,X1,X2,X3,X4,X5). | ||
|  | (Space += element(X1,X2,X3)) :- !, element(Space,X1,X2,X3). | ||
|  | (Space += element(X1,X2,X3,X4)) :- !, element(Space,X1,X2,X3,X4). | ||
|  | (Space += element(X1,X2,X3,X4,X5)) :- !, element(Space,X1,X2,X3,X4,X5). | ||
|  | (Space += element(X1,X2,X3,X4,X5,X6)) :- !, element(Space,X1,X2,X3,X4,X5,X6). | ||
|  | (Space += element(X1,X2,X3,X4,X5,X6,X7)) :- !, element(Space,X1,X2,X3,X4,X5,X6,X7). | ||
|  | (Space += linear(X1,X2,X3)) :- !, linear(Space,X1,X2,X3). | ||
|  | (Space += linear(X1,X2,X3,X4)) :- !, linear(Space,X1,X2,X3,X4). | ||
|  | (Space += linear(X1,X2,X3,X4,X5)) :- !, linear(Space,X1,X2,X3,X4,X5). | ||
|  | (Space += linear(X1,X2,X3,X4,X5,X6)) :- !, linear(Space,X1,X2,X3,X4,X5,X6). | ||
|  | (Space += max(X1,X2)) :- !, max(Space,X1,X2). | ||
|  | (Space += max(X1,X2,X3)) :- !, max(Space,X1,X2,X3). | ||
|  | (Space += max(X1,X2,X3,X4)) :- !, max(Space,X1,X2,X3,X4). | ||
|  | (Space += min(X1,X2)) :- !, min(Space,X1,X2). | ||
|  | (Space += min(X1,X2,X3)) :- !, min(Space,X1,X2,X3). | ||
|  | (Space += min(X1,X2,X3,X4)) :- !, min(Space,X1,X2,X3,X4). | ||
|  | (Space += mod(X1,X2,X3)) :- !, mod(Space,X1,X2,X3). | ||
|  | (Space += mod(X1,X2,X3,X4)) :- !, mod(Space,X1,X2,X3,X4). | ||
|  | (Space += mult(X1,X2,X3)) :- !, mult(Space,X1,X2,X3). | ||
|  | (Space += mult(X1,X2,X3,X4)) :- !, mult(Space,X1,X2,X3,X4). | ||
|  | (Space += nooverlap(X1,X2,X3,X4)) :- !, nooverlap(Space,X1,X2,X3,X4). | ||
|  | (Space += nooverlap(X1,X2,X3,X4,X5)) :- !, nooverlap(Space,X1,X2,X3,X4,X5). | ||
|  | (Space += nooverlap(X1,X2,X3,X4,X5,X6)) :- !, nooverlap(Space,X1,X2,X3,X4,X5,X6). | ||
|  | (Space += nooverlap(X1,X2,X3,X4,X5,X6,X7)) :- !, nooverlap(Space,X1,X2,X3,X4,X5,X6,X7). | ||
|  | (Space += nooverlap(X1,X2,X3,X4,X5,X6,X7,X8)) :- !, nooverlap(Space,X1,X2,X3,X4,X5,X6,X7,X8). | ||
|  | (Space += notMax(X1,X2)) :- !, notMax(Space,X1,X2). | ||
|  | (Space += notMin(X1,X2)) :- !, notMin(Space,X1,X2). | ||
|  | (Space += path(X1,X2,X3)) :- !, path(Space,X1,X2,X3). | ||
|  | (Space += path(X1,X2,X3,X4)) :- !, path(Space,X1,X2,X3,X4). | ||
|  | (Space += path(X1,X2,X3,X4,X5)) :- !, path(Space,X1,X2,X3,X4,X5). | ||
|  | (Space += path(X1,X2,X3,X4,X5,X6)) :- !, path(Space,X1,X2,X3,X4,X5,X6). | ||
|  | (Space += path(X1,X2,X3,X4,X5,X6,X7)) :- !, path(Space,X1,X2,X3,X4,X5,X6,X7). | ||
|  | (Space += path(X1,X2,X3,X4,X5,X6,X7,X8)) :- !, path(Space,X1,X2,X3,X4,X5,X6,X7,X8). | ||
|  | (Space += precede(X1,X2)) :- !, precede(Space,X1,X2). | ||
|  | (Space += precede(X1,X2,X3)) :- !, precede(Space,X1,X2,X3). | ||
|  | (Space += precede(X1,X2,X3,X4)) :- !, precede(Space,X1,X2,X3,X4). | ||
|  | (Space += rel(X1,X2)) :- !, rel(Space,X1,X2). | ||
|  | (Space += rel(X1,X2,X3)) :- !, rel(Space,X1,X2,X3). | ||
|  | (Space += rel(X1,X2,X3,X4)) :- !, rel(Space,X1,X2,X3,X4). | ||
|  | (Space += rel(X1,X2,X3,X4,X5)) :- !, rel(Space,X1,X2,X3,X4,X5). | ||
|  | (Space += sequence(X1)) :- !, sequence(Space,X1). | ||
|  | (Space += sequence(X1,X2)) :- !, sequence(Space,X1,X2). | ||
|  | (Space += sequence(X1,X2,X3,X4,X5)) :- !, sequence(Space,X1,X2,X3,X4,X5). | ||
|  | (Space += sequence(X1,X2,X3,X4,X5,X6)) :- !, sequence(Space,X1,X2,X3,X4,X5,X6). | ||
|  | (Space += sorted(X1,X2)) :- !, sorted(Space,X1,X2). | ||
|  | (Space += sorted(X1,X2,X3)) :- !, sorted(Space,X1,X2,X3). | ||
|  | (Space += sorted(X1,X2,X3,X4)) :- !, sorted(Space,X1,X2,X3,X4). | ||
|  | (Space += sqr(X0,X1,X2,X3)) :- !, sqr(Space,X0,X1,X2,X3). | ||
|  | (Space += sqr(X1,X2)) :- !, sqr(Space,X1,X2). | ||
|  | (Space += sqrt(X1,X2)) :- !, sqrt(Space,X1,X2). | ||
|  | (Space += sqrt(X1,X2,X3)) :- !, sqrt(Space,X1,X2,X3). | ||
|  | (Space += unary(X1,X2)) :- !, unary(Space,X1,X2). | ||
|  | (Space += unary(X1,X2,X3)) :- !, unary(Space,X1,X2,X3). | ||
|  | (Space += unary(X1,X2,X3,X4)) :- !, unary(Space,X1,X2,X3,X4). | ||
|  | (Space += unary(X1,X2,X3,X4,X5)) :- !, unary(Space,X1,X2,X3,X4,X5). | ||
|  | (Space += unshare(X1)) :- !, unshare(Space,X1). | ||
|  | (Space += unshare(X1,X2)) :- !, unshare(Space,X1,X2). | ||
|  | (Space += weights(X1,X2,X3,X4)) :- !; weights(Space,X1,X2,X3,X4). | ||
|  | 
 | ||
|  | (Space += minimize(X)) :- !, minimize(Space,X). | ||
|  | (Space += maximize(X)) :- !, maximize(Space,X). | ||
|  | (Space += minimize(X,Y)) :- !, minimize(Space,X,Y). | ||
|  | (Space += maximize(X,Y)) :- !, maximize(Space,X,Y). | ||
|  | 
 | ||
|  | (Space += keep(X)) :- !, keep_(Space,X). |