Thanks to visit codestin.com
Credit goes to github.com

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)