
:- object(farmer,
	instantiates(state_space)).


	:- info([
		version is 1.0,
		author is 'Paulo Moura',
		date is 1998/3/23,
		comment is 'Farmer, cabbage, goat, and wolf state space search problem.']).


	initial_state(start, (north, north, north, north)).


	goal_state(end, (south, south, south, south)).


	next_state((Cabbage, Goat, Wolf, Farmer), (FCabbage, Goat, Wolf, FFarmer)) :-
		same_side(Farmer, Cabbage),
		\+ same_side(Goat, Wolf),
		flip(Farmer, FFarmer),
		flip(Cabbage, FCabbage).

	next_state((Cabbage, Goat, Wolf, Farmer), (Cabbage, FGloat, Wolf, FFarmer)) :-
		same_side(Farmer, Goat),
		flip(Farmer, FFarmer),
		flip(Goat, FGloat).

	next_state((Cabbage, Goat, Wolf, Farmer), (Cabbage, Goat, FWolf, FFarmer)) :-
		same_side(Farmer, Wolf),
		\+ same_side(Cabbage, Goat),
		flip(Farmer, FFarmer),
		flip(Wolf, FWolf).

	next_state((Cabbage, Goat, Wolf, Farmer), (Cabbage, Goat, Wolf, FFarmer)) :-
		\+ same_side(Cabbage, Goat),
		\+ same_side(Goat, Wolf),
		flip(Farmer, FFarmer).


	flip(north, south).
	
	flip(south, north).


	same_side(north, north).

	same_side(south, south).


	print_state((Cabbage, Goat, Wolf, Farmer)) :-
		(Cabbage = north -> write(c); write('_')),
		(Goat = north -> write(g); write('_')),
		(Wolf = north -> write(w); write('_')),
		(Farmer = north -> write('f.<__>.........._'); write('_..........<__>.f')),
		(Cabbage = north -> write('_'); write(c)),
		(Goat = north -> write('_'); write(g)),
		(Wolf = north -> write('_'); write(w)),
		nl.


:- end_object.
