Skip to content

Commit 4c9ef4e

Browse files
opensourcewarenorvig
authored andcommitted
Added implementation of the cake problem, tests for cake and three towers problem (aimacode#265)
* Added implementation of the cake problem * Added test for three_block_tower and fixed a bug in three_block_tower code
1 parent 62f2fc0 commit 4c9ef4e

File tree

2 files changed

+53
-4
lines changed

2 files changed

+53
-4
lines changed

planning.py

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ def goal_test(kb):
175175
leave_overnight = Action(expr("LeaveOvernight"), [precond_pos, precond_neg], [effect_add, effect_rem])
176176

177177
return PDLL(init, [remove, put_on, leave_overnight], goal_test)
178-
178+
179179
def three_block_tower():
180180
init = [expr('On(A, Table)'),
181181
expr('On(B, Table)'),
@@ -195,18 +195,44 @@ def goal_test(kb):
195195

196196
## Actions
197197
# Move
198-
precond_pos = [expr('On(b, x)'), expr('Clear(b)'), expr('Clear(y)'), expr('Block(b)'),
199-
expr('Block(y)'), expr('b != x'), expr('b != y'), expr('x != y')]
198+
precond_pos = [expr('On(b, x)'), expr('Clear(b)'), expr('Clear(y)'), expr('Block(b)'), expr('Block(y)')]
200199
precond_neg = []
201200
effect_add = [expr('On(b, y)'), expr('Clear(x)')]
202201
effect_rem = [expr('On(b, x)'), expr('Clear(y)')]
203202
move = Action(expr('Move(b, x, y)'), [precond_pos, precond_neg], [effect_add, effect_rem])
204203

205204
# MoveToTable
206-
precond_pos = [expr('On(b, x)'), expr('Clear(b)'), expr('Block(b)'), expr('b != x')]
205+
precond_pos = [expr('On(b, x)'), expr('Clear(b)'), expr('Block(b)')]
207206
precond_neg = []
208207
effect_add = [expr('On(b, Table)'), expr('Clear(x)')]
209208
effect_rem = [expr('On(b, x)')]
210209
moveToTable = Action(expr('MoveToTable(b, x)'), [precond_pos, precond_neg], [effect_add, effect_rem])
211210

212211
return PDLL(init, [move, moveToTable], goal_test)
212+
213+
def have_cake_and_eat_cake_too():
214+
init = [expr('Have(Cake)')]
215+
216+
def goal_test(kb):
217+
required = [expr('Have(Cake)'), expr('Eaten(Cake)')]
218+
for q in required:
219+
if kb.ask(q) is False:
220+
return False
221+
return True
222+
223+
##Actions
224+
# Eat cake
225+
precond_pos = [expr('Have(Cake)')]
226+
precond_neg = []
227+
effect_add = [expr('Eaten(Cake)')]
228+
effect_rem = [expr('Have(Cake)')]
229+
eat_cake = Action(expr('Eat(Cake)'), [precond_pos, precond_neg], [effect_add, effect_rem])
230+
231+
#Bake Cake
232+
precond_pos = []
233+
precond_neg = [expr('Have(Cake)')]
234+
effect_add = [expr('Have(Cake)')]
235+
effect_rem = []
236+
bake_cake = Action(expr('Bake(Cake)'), [precond_pos, precond_neg], [effect_add, effect_rem])
237+
238+
return PDLL(init, [eat_cake, bake_cake], goal_test)

tests/test_planning.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,3 +46,26 @@ def test_spare_tire():
4646
p.act(action)
4747

4848
assert p.goal_test()
49+
50+
def test_three_block_tower():
51+
p = three_block_tower()
52+
assert p.goal_test() is False
53+
solution = [expr("MoveToTable(C, A)"),
54+
expr("Move(B, Table, C)"),
55+
expr("Move(A, Table, B)")]
56+
57+
for action in solution:
58+
p.act(action)
59+
60+
assert p.goal_test()
61+
62+
def test_have_cake_and_eat_cake_too():
63+
p = have_cake_and_eat_cake_too()
64+
assert p.goal_test() is False
65+
solution = [expr("Eat(Cake)"),
66+
expr("Bake(Cake)")]
67+
68+
for action in solution:
69+
p.act(action)
70+
71+
assert p.goal_test()

0 commit comments

Comments
 (0)