%% Copyright (C) 2012 Igor Stéphan
%% 
%% This program is free software; you can redistribute it and/or
%% modify it under the terms of the GNU General Public License
%% as published by the Free Software Foundation; either version 2
%% 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 General Public License
%% along with this program; if not, write to the Free Software
%% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
%% http:%%www.gnu.org/copyleft/gpl.html
%%
%% igor.stephan@univ-angers.fr
%% 
:- include(base_qcsp).
% symboles de predicat
%  search_base_qcsp  : Liste(_) x Clp x QCSP_Base

% topbase, bottombase : Base
% base : Liste(Vlva) -> Base
% vlva : Var x Liste(Va) -> Vlva
% va : Val x Arbre_Etiquete -> Va
% (_,_) : Val x Arbre_Etiquete
 
%% search_base_qcsp : Liste(Quant)  x Csp x Base
search_base_qcsp(Quant, Contraintes, Base) :-
	search_base_qcsp(Quant, Quant, Contraintes, Base).

%% search_base_qcsp : Liste(Quant) x Liste(Quant)  x Csp x Base
search_base_qcsp([],[], Contraintes, topbase) :-
	call(Contraintes), !.

search_base_qcsp([e(Xinit, _) | VariablesInit], [e(X,D_X) | Variables], Contraintes, Base) :-
	\+(\+(call(Contraintes))),
	e_map_search_base_qcsp(D_X,X, VariablesInit, Variables, Contraintes, Bases),
	(
	  Bases = []
	->
	  Base = bottombase
	;
	  combine_e(Xinit, D_X, Bases, Base)
	),
	!.

search_base_qcsp([a(Xinit, _) | VariablesInit], [a(X,D_X) | Variables], Contraintes, Base) :-
	\+(\+(call(Contraintes))),
	a_map_search_base_qcsp(D_X,X, VariablesInit, Variables, Contraintes, Bases),
	combine_a(Xinit, Bases, Base),
	!.

search_base_qcsp(_, _, _Contraintes, bottombase).
	

%% e_map_search_base_qcsp : Liste(Val) x Var x Liste(Quant) x Liste(Quant) x Csp x Liste(Base)
e_map_search_base_qcsp([], _X, _VariablesInit, _Variables, _Contraintes, []).
e_map_search_base_qcsp([Val | D_X], X, VariablesInit, Variables, Contraintes, Bases):-
	copy_term((Variables, X, Contraintes), (Variables_Val, Val, Contraintes_Val)),
	search_base_qcsp(VariablesInit, Variables_Val, Contraintes_Val, Base_Val),
	e_map_search_base_qcsp(D_X, X, VariablesInit, Variables, Contraintes, Bases_),
 	(
 	  Base_Val = bottombase
 	->
 	  Bases = Bases_
 	;
	  Bases = [(Val, Base_Val) | Bases_]
	).


%% a_map_search_base_qcsp : Liste(Val) x Var x Liste(Quant) x Liste(Quant) x Csp x Liste(Base)
a_map_search_base_qcsp([], _X, _VariablesInit, _Variables, _Contraintes, []).
a_map_search_base_qcsp([Val | D_X], X, VariablesInit, Variables, Contraintes, [(Val, Base_Val) | Bases]):-
	copy_term((Variables, X, Contraintes), (Variables_Val, Val, Contraintes_Val)),
	search_base_qcsp(VariablesInit, Variables_Val, Contraintes_Val, Base_Val),
	\+ (Base_Val = bottombase),
	a_map_search_base_qcsp(D_X, X, VariablesInit, Variables, Contraintes, Bases).
