git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@1114 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
		
			
				
	
	
		
			80 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			80 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
 | |
| :- object(bridge,
 | |
| 	instantiates(heuristic_state_space)).
 | |
| 
 | |
| 
 | |
| 	:- info([
 | |
| 		version is 1.1,
 | |
| 		author is 'Paulo Moura',
 | |
| 		date is 2004/8/15,
 | |
| 		comment is 'Bridge puzzle.']).
 | |
| 
 | |
| 
 | |
| 	:- uses(list, [append/3]).
 | |
| 	:- uses(numberlist, [min/2, max/2]).
 | |
| 	:- uses(set, [insert/3, insert_all/3, select/3]).
 | |
| 	
 | |
| 
 | |
| 	initial_state(start, ([], right, [1,3,6,8,12])).
 | |
| 
 | |
| 
 | |
| 	goal_state(end, ([1,3,6,8,12], left, [])).
 | |
| 
 | |
| 
 | |
| 	next_state((Left1, left, Right1), (Left2, right, Right2), Slower) :-	% two persons
 | |
| 		append(List, [Person1| Persons], Left1),
 | |
| 		select(Person2, Persons, Others),
 | |
| 		append(List, Others, Left2),
 | |
| 		insert_all([Person1, Person2], Right1, Right2),
 | |
| 		(Person1 > Person2 ->
 | |
| 			Slower = Person1
 | |
| 			;
 | |
| 			Slower = Person2).
 | |
| 
 | |
| 	next_state((Left1, right, Right1), (Left2, left, Right2), Slower) :-	% two persons
 | |
| 		append(List, [Person1| Persons], Right1),
 | |
| 		select(Person2, Persons, Others),
 | |
| 		append(List, Others, Right2),
 | |
| 		insert_all([Person1, Person2], Left1, Left2),
 | |
| 		(Person1 > Person2 ->
 | |
| 			Slower = Person1
 | |
| 			;
 | |
| 			Slower = Person2).
 | |
| 
 | |
| 	next_state((Left1, left, Right1), (Left2, right, Right2), Person) :-	% one person
 | |
| 		select(Person, Left1, Left2),
 | |
| 		insert(Right1, Person, Right2).
 | |
| 		
 | |
| 	next_state((Left1, right, Right1), (Left2, left, Right2), Person) :-	% one person
 | |
| 		select(Person, Right1, Right2),
 | |
| 		insert(Left1, Person, Left2).
 | |
| 
 | |
| 
 | |
| 	heuristic((Left, Lamp, Right), Heuristic) :-
 | |
| 		Lamp = left ->
 | |
| 			list::min(Left, Heuristic)
 | |
| 			;
 | |
| 			list::max(Right, Max),
 | |
| 			list::min(Right, Min),
 | |
| 			Heuristic is Max + Min.
 | |
| 
 | |
| 
 | |
| 	print_state((Left, Lamp, Right)) :-
 | |
| 		write_list(Left),
 | |
| 		(Lamp = left ->
 | |
| 			write(' lamp _|____________|_ ')
 | |
| 			;
 | |
| 			write(' _|____________|_ lamp ')),
 | |
| 		write_list(Right),
 | |
| 		nl.
 | |
| 
 | |
| 
 | |
| 	write_list([]).
 | |
| 	
 | |
| 	write_list([Head| Tail]) :-
 | |
| 		write(Head), write(' '),
 | |
| 		write_list(Tail).
 | |
| 
 | |
| 
 | |
| :- end_object.
 |