:- object(hill_climbing(Threshold),
	instantiates(heuristic_search(Threshold))).


	:- info([
		version is 1.1,
		author is 'Paulo Moura',
		date is 2004/8/15,
		comment is 'Hill climbing heuristic state space search strategy.',
		parnames is ['Threshold']]).


	:- uses(list,
		[member/2, reverse/2, sort/2]).

	:- private(hill/7).


	search(Space, State, Threshold, Solution, Cost) :-
		hill(Space, State, Threshold, [], Path, 0, Cost),
		reverse(Path, Solution).


	hill(Space, State, _, Path, [State| Path], Cost, Cost) :-
		Space::goal_state(State).

	hill(Space, State, Threshold, Path, Solution, SoFar, Total) :-
		findall(
			(Estimate, Cost, Next),
			(Space::next_state(State, Next, Cost),
             \+ member(Next, [State| Path]),
             Space::heuristic(Next, Guess),
             Estimate is Guess + Cost),
			States),
		sort(States, SortedStates),
		member((_, Cost2, Next2), SortedStates),
		SoFar2 is SoFar + Cost2,
		SoFar2 =< Threshold,
		hill(Space, Next2, Threshold, [State| Path], Solution, SoFar2, Total).


:- end_object.