:- object(farmer, instantiates(state_space)). :- info([ version is 1.0, authors 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.