// Block world, with 4 blocks A, B, C, D, and one table
//
//    |A|
//    |B|
//    |C|    ---->   |C|   |D|
//    |D|            |A|   |B|
//
// Meanings of facts
// ta = onTable(a)
// oab = on(a, b)   a is on block b
// na = nothingOnTopOf(a)
//
// Meanings of operators
// sAB = stack a on b
// uAB = remove a from b,  and put a on table.

#facts
(td, ocd, obc, oab, na)

#operator
//(op <name> <precond-list> <pos-effect-list> <neg-effect-list>)

//Move action
(
(op sAB
	(nb, ta, na)
	(oab)
	(nb, ta))
	
(op sAC
	(nc, ta, na)
	(oac)
	(nc, ta))

(op sAD
	(nd, ta, na)
	(oad)
	(nd, ta))
	
(op sBA
	(na, tb, nb)
	(oba)
	(na, tb))
	
(op sBC
	(nc, tb, nb)
	(obc)
	(nc, tb))

(op sBD
	(nd, tb, nb)
	(obd)
	(nd, tb))

(op sCA
	(na, tc, nc)
	(oca)
	(na, tc))

(op sCB
	(nb, tc, nc)
	(ocb)
	(nb, tc))
	
(op sCD
	(nd, tc, nc)
	(ocd)
	(nd, tc))

(op sDA
	(na, td, nd)
	(oda)
	(na, td))

(op sDB
	(nb, td, nd)
	(odb)
	(nb, td))
	
(op sDC
	(nc, td, nd)
	(odc)
	(nc, td))

(op uAB
	(na, oab)
	(ta, nb)
	(oab))
	
(op uAC
	(na, oac)
	(ta, nc)
	(oac))

(op uAD
	(na, oad)
	(ta, nd)
	(oad))		

(op uBA
	(nb, oba)
	(tb, na)
	(oba))
	
(op uBC
	(nb, obc)
	(tb, nc)
	(obc))

(op uBD
	(nb, obd)
	(tb, nd)
	(obd))		

(op uCA
	(nc, oca)
	(tc, na)
	(oca))
	
(op uCB
	(nc, ocb)
	(tc, nb)
	(ocb))

(op uCD
	(nc, ocd)
	(tc, nd)
	(ocd))

(op uDA
	(nd, oda)
	(td, na)
	(oda))
	
(op uDB
	(nd, odb)
	(td, nb)
	(odb))

(op uDC
	(nd, odc)
	(td, nc)
	(odc))
)

#goal
( oca, odb, ta, tb, nc, nd)