diff --git a/planning.py b/planning.py index 92f4f773e..c4ebe1181 100644 --- a/planning.py +++ b/planning.py @@ -175,3 +175,38 @@ def goal_test(kb): leave_overnight = Action(expr("LeaveOvernight"), [precond_pos, precond_neg], [effect_add, effect_rem]) return PDLL(init, [remove, put_on, leave_overnight], goal_test) + +def three_block_tower(): + init = [expr('On(A, Table)'), + expr('On(B, Table)'), + expr('On(C, A)'), + expr('Block(A)'), + expr('Block(B)'), + expr('Block(C)'), + expr('Clear(B)'), + expr('Clear(C)')] + + def goal_test(kb): + required = [expr('On(A, B)'), expr('On(B, C)')] + for q in required: + if kb.ask(q) is False: + return False + return True + + ## Actions + # Move + precond_pos = [expr('On(b, x)'), expr('Clear(b)'), expr('Clear(y)'), expr('Block(b)'), + expr('Block(y)'), expr('b != x'), expr('b != y'), expr('x != y')] + precond_neg = [] + effect_add = [expr('On(b, y)'), expr('Clear(x)')] + effect_rem = [expr('On(b, x)'), expr('Clear(y)')] + move = Action(expr('Move(b, x, y)'), [precond_pos, precond_neg], [effect_add, effect_rem]) + + # MoveToTable + precond_pos = [expr('On(b, x)'), expr('Clear(b)'), expr('Block(b)'), expr('b != x')] + precond_neg = [] + effect_add = [expr('On(b, Table)'), expr('Clear(x)')] + effect_rem = [expr('On(b, x)')] + moveToTable = Action(expr('MoveToTable(b, x)'), [precond_pos, precond_neg], [effect_add, effect_rem]) + + return PDLL(init, [move, moveToTable], goal_test)