diff --git a/planning.py b/planning.py index c4ebe1181..2dd57787a 100644 --- a/planning.py +++ b/planning.py @@ -175,7 +175,7 @@ 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)'), @@ -195,18 +195,44 @@ def goal_test(kb): ## 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_pos = [expr('On(b, x)'), expr('Clear(b)'), expr('Clear(y)'), expr('Block(b)'), expr('Block(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_pos = [expr('On(b, x)'), expr('Clear(b)'), expr('Block(b)')] 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) + +def have_cake_and_eat_cake_too(): + init = [expr('Have(Cake)')] + + def goal_test(kb): + required = [expr('Have(Cake)'), expr('Eaten(Cake)')] + for q in required: + if kb.ask(q) is False: + return False + return True + + ##Actions + # Eat cake + precond_pos = [expr('Have(Cake)')] + precond_neg = [] + effect_add = [expr('Eaten(Cake)')] + effect_rem = [expr('Have(Cake)')] + eat_cake = Action(expr('Eat(Cake)'), [precond_pos, precond_neg], [effect_add, effect_rem]) + + #Bake Cake + precond_pos = [] + precond_neg = [expr('Have(Cake)')] + effect_add = [expr('Have(Cake)')] + effect_rem = [] + bake_cake = Action(expr('Bake(Cake)'), [precond_pos, precond_neg], [effect_add, effect_rem]) + + return PDLL(init, [eat_cake, bake_cake], goal_test) diff --git a/tests/test_planning.py b/tests/test_planning.py index 739324256..3567ab445 100644 --- a/tests/test_planning.py +++ b/tests/test_planning.py @@ -46,3 +46,26 @@ def test_spare_tire(): p.act(action) assert p.goal_test() + +def test_three_block_tower(): + p = three_block_tower() + assert p.goal_test() is False + solution = [expr("MoveToTable(C, A)"), + expr("Move(B, Table, C)"), + expr("Move(A, Table, B)")] + + for action in solution: + p.act(action) + + assert p.goal_test() + +def test_have_cake_and_eat_cake_too(): + p = have_cake_and_eat_cake_too() + assert p.goal_test() is False + solution = [expr("Eat(Cake)"), + expr("Bake(Cake)")] + + for action in solution: + p.act(action) + + assert p.goal_test()
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies: