;***************************  HOTEL  WORLD  ***********************
;                       Robotic  Room  Cleanning
;
;********************
; OPERATORS
;********************

(setq *OPERATORS* '(


(move-robot-and-cart
  (params	(<cart1> <current-room1> <next-room> <door1>))
  (preconds	
	(and	
		(is-type <cart1> cart)
		(is-type <current-room1> room)
		(is-type <next-room> room)
		(is-type <door1> door) 
		(near-to rob <cart1>)
		(holding cart-handle)
		(connects <door> <current-room1> <next-room>)
		(status <door> open)))
  (effects	((del (current-room <current-room1>))
		(del (in-room rob <current-room1>))
		(del (in-room cart1 <current-room1>))
		(del (near-to rob <*>))
		(add (current-room <next-room>))
		(add (in-room rob <next-room>))
		(add (in-room <cart1> <next-room>)))))


(move-robot-near-to
  (params	(<obj> <rm>))
  (preconds
	(and
		(or
		   (is-type <obj> object)
		   (is-type <obj> door))
		(is-type <rm> room)
		(current-room <rm>)
		(in-room <obj> <rm>)
		(in-room rob <rm>)	;NOT needed since rob is in 
		))				;current-room by definition

  (effects	((del (near-to rob <*>))	;remove all objs near-to rel
		(add (near-to rob <obj>))
		)))





(robot-enter-room
  (params	( <aDoor> <rm1> <rm2>))
  (preconds
	(and
		(is-type <aDoor> door)
		(connects <aDoor> <rm1> <rm2>)
		(status <aDoor> open)
		))
  (effects	((del (current-room <rm1>))
		(add (current-room <rm2>))
		(add (in-room rob <rm2>))
		)))



(pick-up
 (params (<ob1>))
 (preconds (and (is-type <ob1> object)
		(near-to rob <ob1>)
 		(arm-empty)))
 (effects ((add (holding <ob1>)))))
           


(put-down                   
  (params	(<obj>))
  (preconds
		(holding <obj>)
		)
  (effects	((del (holding <obj>))
		)))



(open-door
  (params	(<door>))
  (preconds
	(and
		(arm-empty)
		(is-type <door> door)
		(status <door> closed)
		(near-to rob <door>)
		(status <door> unlocked)
		))
  (effects	((del (status <door> closed))
		(add (status <door> open))
		)))







(unlock-door
  (params	(<door>))
  (preconds
	(and
		(is-type <door> door)
		(near-to rob <door>)
		(knocked <door>)
		(shouted-message <door>)
		(holding key)
		))
  (effects	((del (status <door> locked))
		(add (status <door> unlocked))
		)))



(knock-on-door
  (params	(<door>))
  (preconds
	(and
		(is-type <door> door)
		(arm-empty)
		(near-to rob <door>)
		))
  (effects	((add (knocked <door>))
		)))



(shout-house-cleanning
  (params	(<door>))
  (preconds
	(and
		(is-type <door> door)
		(near-to rob <door>)
		))
  (effects	((add (shouted-message <door>))
		)))
))

;**********************************
;INFERENCE  RULES
;**********************************

(setq *INFERENCE-RULES* '(

(infer-arm-empty
  (params nil)
  (preconds
	(~ (exists (<obj>) (holding <obj>))))
  (effects ((add (arm-empty)))))
))
