which included commits to RCS files with non-trunk default branches. git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@5 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
		
			
				
	
	
		
			341 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			Prolog
		
	
	
	
	
	
			
		
		
	
	
			341 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			Prolog
		
	
	
	
	
	
| %
 | |
| % Monkey and Bananas:
 | |
| %
 | |
| % Forward chaining rules via CHR.
 | |
| % rules inspired from ftp://ftp.cs.unibo.it:/pub/gaspari/fw_rules/
 | |
| % Quite fast because no dynamic predicates are used to
 | |
| % represent the facts.
 | |
| % The amount of code generated is substantial however.
 | |
| % Not optimized
 | |
| %
 | |
| % 970213 Christian Holzbaur
 | |
| 
 | |
| :- use_module(library(chr)).
 | |
| 
 | |
| handler monkey.
 | |
| 
 | |
| constraints phys_object/7, monkey/3, goal/5, found/0.
 | |
| % explaination of constraints is missing here
 | |
| 
 | |
| :- op(900,fy,not).
 | |
| % There is no such fact ('not exists' in SQL)
 | |
| not Fact :- find_constraint( Fact, _), !, fail.
 | |
| not _.
 | |
| 
 | |
| 
 | |
| testcase(1) :-
 | |
| 	phys_object(bananas,9-9,light,ceiling,_,_,ok),
 | |
| 	phys_object(couch,7-7,heavy,floor,_,low,_),
 | |
| 	phys_object(ladder,4-3,light,floor,_,high,_),
 | |
| 	phys_object(blanket,7-7,light,_,_,_,_),
 | |
| 	phys_object(garbage_can,3-5,light,floor,_,low,_),
 | |
| 	monkey(7-7,couch,blanket),
 | |
| 	goal(active,holds,bananas,_,_).
 | |
| 
 | |
| 
 | |
|  rule(1) @
 | |
|   goal(active,on,floor,A,B), 
 | |
|     monkey(D,E,F) <=>
 | |
| 
 | |
|     E\==floor
 | |
|     |
 | |
|     write('Jump onto the floor'),
 | |
|     nl,
 | |
|     monkey(D,floor,F),
 | |
|     goal(satisfied,on,floor,A,B).
 | |
| 
 | |
| 
 | |
|  rule(2) @
 | |
|   monkey(A,floor,B) \ 
 | |
|     goal(active,on,floor,D,E) <=>
 | |
| 
 | |
|     write('Monkey is already on floor'),
 | |
|     nl,
 | |
|     goal(satisfied,on,floor,D,E).
 | |
| 
 | |
| 
 | |
|  rule(3) @
 | |
|   phys_object(A,B,C,floor,D,E,F) \ 
 | |
|     goal(active,on,A,H,I), 
 | |
|       monkey(B,K,nothing) <=>
 | |
| 
 | |
|       K\==A
 | |
|       |
 | |
|       write('Climb onto '),
 | |
|       write(A),
 | |
|       nl,
 | |
|       monkey(B,A,nothing),
 | |
|       goal(satisfied,on,A,H,I).
 | |
| 
 | |
| 
 | |
|  rule(4) @
 | |
|   goal(active,on,A,B,C), 
 | |
|     phys_object(A,E,F,G,H,I,J), 
 | |
|       monkey(E,L,M) ==>
 | |
| 
 | |
|       M\==nothing
 | |
|       |
 | |
|       write('Put '),
 | |
|       nl,
 | |
|       goal(active,holds,nothing,O,P).
 | |
| 
 | |
| 
 | |
|  rule(5) @
 | |
|   goal(active,on,A,B,C), 
 | |
|     phys_object(A,E,F,floor,G,H,I), 
 | |
|       monkey(K,L,M) ==>
 | |
| 
 | |
|       K\==E
 | |
|       |
 | |
|       goal(active,at,nothing,O,E).
 | |
| 
 | |
| 
 | |
|  rule(6) @
 | |
|   phys_object(A,B,C,floor,D,E,F), 
 | |
|     monkey(B,A,H) \ 
 | |
|       goal(active,on,A,J,K) <=>
 | |
| 
 | |
|       write('Monkey is already on '),
 | |
|       write(A),
 | |
|       nl,
 | |
|       goal(satisfied,on,A,J,K).
 | |
| 
 | |
| 
 | |
|  rule(7) @
 | |
|   goal(active,holds,nothing,A,B), 
 | |
|     monkey(D,E,F), 
 | |
|       phys_object(F,H,I,J,K,L,M) <=>
 | |
| 
 | |
|       F\==nothing
 | |
|       |
 | |
|       write('Drop '),
 | |
|       write(F),
 | |
|       nl,
 | |
|       goal(satisfied,holds,nothing,A,B),
 | |
|       monkey(D,E,nothing),
 | |
|       phys_object(F,H,I,floor,K,L,M).
 | |
| 
 | |
| 
 | |
|  rule(8) @
 | |
|   goal(active,holds,nothing,A,B), 
 | |
|     monkey(D,E,nothing) ==>
 | |
| 
 | |
|     write('Monkey is holding nothing'),
 | |
|     nl,
 | |
|     goal(satisfied,holds,nothing,A,B).
 | |
| 
 | |
| 
 | |
|  rule(9) @
 | |
|   phys_object(ladder,A,B,floor,C,D,E) \ 
 | |
|     goal(active,holds,G,H,I), 
 | |
|       phys_object(G,A,light,ceiling,K,L,M), 
 | |
|         monkey(O,ladder,nothing) <=>
 | |
| 
 | |
|         not phys_object(Q,R,S,G,T,U,V)
 | |
|         |
 | |
|         write('Grab '),
 | |
|         write(G),
 | |
|         nl,
 | |
|         monkey(O,ladder,G),
 | |
|         phys_object(G,A,light,nothing,K,L,M),
 | |
|         goal(satisfied,holds,G,H,I).
 | |
| 
 | |
| 
 | |
|  rule(10) @
 | |
|   goal(active,holds,A,B,C), 
 | |
|     phys_object(A,E,light,ceiling,F,G,H), 
 | |
|       phys_object(ladder,E,J,floor,K,L,M), 
 | |
|         monkey(O,P,Q) ==>
 | |
| 
 | |
|         P\==ladder
 | |
|         |
 | |
|         goal(active,on,ladder,S,T).
 | |
| 
 | |
| 
 | |
|  rule(11) @
 | |
|   goal(active,holds,A,B,C), 
 | |
|     phys_object(A,E,light,ceiling,F,G,H), 
 | |
|       phys_object(ladder,J,K,L,M,N,O) ==>
 | |
| 
 | |
|       J\==E,
 | |
|       not goal(active,at,ladder,Q,E)
 | |
|       |
 | |
|       goal(active,at,ladder,R,E).
 | |
| 
 | |
| 
 | |
|  rule(12) @
 | |
|   goal(active,holds,A,B,C), 
 | |
|     phys_object(A,E,light,F,G,H,I), 
 | |
|       monkey(E,floor,nothing) <=>
 | |
| 
 | |
|       F\==ceiling,
 | |
|       not phys_object(L,M,N,A,O,P,Q)
 | |
|       |
 | |
|       write('Grab '),
 | |
|       write(A),
 | |
|       nl,
 | |
|       phys_object(A,E,light,nothing,G,H,I),
 | |
|       monkey(E,floor,A),
 | |
|       goal(satisfied,holds,A,B,C).
 | |
| 
 | |
| 
 | |
|  rule(13) @
 | |
|   goal(active,holds,A,B,C), 
 | |
|     phys_object(A,E,light,F,G,H,I), 
 | |
|       monkey(E,F,K) ==>
 | |
| 
 | |
|       F\==ceiling,
 | |
|       F\==floor
 | |
|       |
 | |
|       goal(active,on,floor,M,N).
 | |
| 
 | |
| 
 | |
|  rule(14) @
 | |
|   goal(active,holds,A,B,C), 
 | |
|     phys_object(A,E,light,F,G,H,I), 
 | |
|       monkey(K,L,M) ==>
 | |
| 
 | |
|       F\==ceiling,
 | |
|       K\==E,
 | |
|       not goal(active,at,nothing,O,P)
 | |
|       |
 | |
|       goal(active,at,nothing,Q,E).
 | |
| 
 | |
| 
 | |
|  rule(15) @
 | |
|   goal(active,holds,A,B,C), 
 | |
|     phys_object(A,E,light,F,G,H,I), 
 | |
|       monkey(E,K,L) ==>
 | |
| 
 | |
|       L\==nothing,
 | |
|       L\==A,
 | |
|       not goal(active,holds,nothing,N,O)
 | |
|       |
 | |
|       goal(active,holds,nothing,P,Q).
 | |
| 
 | |
| 
 | |
|  rule(16) @
 | |
|   goal(active,at,A,B,C), 
 | |
|     monkey(E,floor,A), 
 | |
|       phys_object(A,G,H,I,J,K,L) <=>
 | |
| 
 | |
|       E\==C
 | |
|       |
 | |
|       write('Move '),
 | |
|       write(A),
 | |
|       write(' to '),
 | |
|       write(C),
 | |
|       nl,
 | |
|       phys_object(A,C,H,I,J,K,L),
 | |
|       monkey(C,floor,A),
 | |
|       goal(satisfied,at,A,B,C).
 | |
| 
 | |
| 
 | |
|  rule(17) @
 | |
|   goal(active,at,A,B,C), 
 | |
|     monkey(E,F,A), 
 | |
|       phys_object(A,H,I,J,K,L,M) ==>
 | |
| 
 | |
|       F\==floor,
 | |
|       H\==C,
 | |
|       not goal(active,on,floor,O,P)
 | |
|       |
 | |
|       goal(active,on,floor,Q,R).
 | |
| 
 | |
| 
 | |
|  rule(18) @
 | |
|   goal(active,at,A,B,C), 
 | |
|     phys_object(A,E,light,F,G,H,I), 
 | |
|       monkey(K,L,M) ==>
 | |
| 
 | |
|       E\==C,
 | |
|       M\==A,
 | |
|       not goal(active,holds,A,O,P)
 | |
|       |
 | |
|       goal(active,holds,A,Q,R).
 | |
| 
 | |
| 
 | |
|  rule(19) @
 | |
|   phys_object(A,B,light,C,D,E,F) \ 
 | |
|     goal(active,at,A,H,B) <=>
 | |
| 
 | |
|     write('The object '),
 | |
|     write(A),
 | |
|     write(' is already at '),
 | |
|     write(B),
 | |
|     nl,
 | |
|     goal(satisfied,at,A,H,B).
 | |
| 
 | |
| 
 | |
|  rule(20) @
 | |
|   goal(active,at,nothing,A,B), 
 | |
|     monkey(B,floor,nothing) <=>
 | |
| 
 | |
|     write('Walk to '),
 | |
|     write(B),
 | |
|     nl,
 | |
|     monkey(B,floor,nothing),
 | |
|     goal(satisfied,at,nothing,A,B).
 | |
| 
 | |
| 
 | |
|  rule(21) @
 | |
|   goal(active,at,nothing,A,B), 
 | |
|     monkey(D,floor,E), 
 | |
|       phys_object(E,G,H,I,J,K,L) <=>
 | |
| 
 | |
|       D\==B
 | |
|       |
 | |
|       write('Walk to '),
 | |
|       write(B),
 | |
|       write(' carrying '),
 | |
|       write(E),
 | |
|       nl,
 | |
|       monkey(B,floor,E),
 | |
|       phys_object(E,B,H,I,J,K,L),
 | |
|       goal(satisfied,at,nothing,A,B).
 | |
| 
 | |
| 
 | |
|  rule(22) @
 | |
|   goal(active,at,nothing,A,B), 
 | |
|     monkey(D,E,F) ==>
 | |
| 
 | |
|     E\==floor,
 | |
|     D\==B
 | |
|     |
 | |
|     goal(active,on,floor,H,I).
 | |
| 
 | |
| 
 | |
|  rule(23) @
 | |
|   monkey(A,B,C) \ 
 | |
|     goal(active,at,nothing,E,A) <=>
 | |
| 
 | |
|     write('Monkey is already at '),
 | |
|     write(A),
 | |
|     nl,
 | |
|     goal(satisfied,at,nothing,E,A).
 | |
| 
 | |
| 
 | |
|  rule(24) @
 | |
|   goal(satisfied,A,B,C,D) ==>
 | |
| 
 | |
|   not goal(active,F,G,H,I),
 | |
|   not found
 | |
|   |
 | |
|   write('CONGRATULATIONS the goals are satisfied'),
 | |
|   nl,
 | |
|   found.
 | |
| 
 | |
| 
 | |
|  rule(25) @
 | |
|   goal(active,holds,A,B,C), 
 | |
|     phys_object(A,E,light,nothing,F,G,H), 
 | |
|       monkey(E,J,A) ==>
 | |
| 
 | |
|       write('Object '),
 | |
|       write(A),
 | |
|       write(' is already being held'),
 | |
|       nl,
 | |
|       goal(satisfied,holds,A,B,C).
 | |
| 
 | |
| end_of_file.
 |