(define (domain parking)
 (:requirements :strips :typing)
 (:types car curb)
 (:predicates
    (atcurb ?car - car)
    (atcurbnum ?car - car ?curb - curb)
    (behindcar ?car - car ?frontcar - car)
    (carclear ?car - car)
    (curbclear ?curb - curb)
 )

	(:action movecurbtocurb
		:parameters (?o1 - car ?o2 - curb ?o3 - curb)
		:precondition (and
			(carclear ?o1)
			(curbclear ?o3)
			(atcurbnum ?o1 ?o2)
		)
		:effect (and
			(not (curbclear ?o3))
			(curbclear ?o2)
			(atcurbnum ?o1 ?o3)
			(not (atcurbnum ?o1 ?o2))
		)
	)

	(:action movecurbtocar
		:parameters (?o1 - car ?o2 - curb ?o3 - car)
		:precondition (and
			(carclear ?o1)
			(carclear ?o3)
			(atcurbnum ?o1 ?o2)
			(atcurb ?o3)
		)
		:effect (and
			(not (carclear ?o3))
			(curbclear ?o2)
			(behindcar ?o1 ?o3)
			(not (atcurbnum ?o1 ?o2))
			(not (atcurb ?o1))
		)
	)

	(:action movecartocurb
		:parameters (?o1 - car ?o2 - car ?o3 - curb)
		:precondition (and
			(carclear ?o1)
			(curbclear ?o3)
			(behindcar ?o1 ?o2)
		)
		:effect (and
			(not (curbclear ?o3))
			(carclear ?o2)
			(atcurbnum ?o1 ?o3)
			(not (behindcar ?o1 ?o2))
			(atcurb ?o1)
		)
	)

	(:action movecartocar
		:parameters (?o1 - car ?o2 - car ?o3 - car)
		:precondition (and
			(carclear ?o1)
			(carclear ?o3)
			(behindcar ?o1 ?o2)
			(atcurb ?o3)
		)
		:effect (and
			(not (carclear ?o3))
			(carclear ?o2)
			(behindcar ?o1 ?o3)
			(not (behindcar ?o1 ?o2))
		)
	)
)
