Skip to content

Commit 9669658

Browse files
author
rahulptel
committed
Added implementation of Three Block Tower and Cake Problem in Planning module
1 parent 045ba49 commit 9669658

File tree

2 files changed

+84
-0
lines changed

2 files changed

+84
-0
lines changed

planning.py

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,3 +175,65 @@ 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+
179+
def three_block_tower():
180+
init = [expr('On(A, Table)'),
181+
expr('On(B, Table)'),
182+
expr('On(C, A)'),
183+
expr('Block(A)'),
184+
expr('Block(B)'),
185+
expr('Block(C)'),
186+
expr('Clear(B)'),
187+
expr('Clear(C)')]
188+
189+
def goal_test(kb):
190+
required = [expr('On(A, B)'), expr('On(B, C)')]
191+
for q in required:
192+
if kb.ask(q) is False:
193+
return False
194+
return True
195+
196+
## Actions
197+
# 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')]
200+
precond_neg = []
201+
effect_add = [expr('On(b, y)'), expr('Clear(x)')]
202+
effect_rem = [expr('On(b, x)'), expr('Clear(y)')]
203+
move = Action(expr('Move(b, x, y)'), [precond_pos, precond_neg], [effect_add, effect_rem])
204+
205+
# MoveToTable
206+
precond_pos = [expr('On(b, x)'), expr('Clear(b)'), expr('Block(b)'), expr('b != x')]
207+
precond_neg = []
208+
effect_add = [expr('On(b, Table)'), expr('Clear(x)')]
209+
effect_rem = [expr('On(b, x)')]
210+
moveToTable = Action(expr('MoveToTable(b, x)'), [precond_pos, precond_neg], [effect_add, effect_rem])
211+
212+
return PDLL(init, [move, moveToTable], goal_test)
213+
214+
def cake():
215+
init = [expr('Have(Cake)')]
216+
217+
def goal_test(kb):
218+
required = [expr('Have(Cake)'), expr('Eaten(Cake)')]
219+
for q in required:
220+
if kb.ask(q) is False:
221+
return False
222+
return True
223+
224+
## Actions
225+
# Eat
226+
precond_pos = [expr('Have(Cake)')]
227+
precond_neg = []
228+
effect_add = [expr('Eaten(Cake)')]
229+
effect_rem = [expr('Have(Cake)')]
230+
eat = Action(expr('Eat(Cake)'), [precond_pos, precond_neg], [effect_add, effect_rem])
231+
232+
# Bake
233+
precond_pos = []
234+
precond_neg = [expr('Have(Cake)')]
235+
effect_add = [expr('Have(Cake)')]
236+
effect_rem = []
237+
bake = Action(expr('Bake(Cake)'), [precond_pos, precond_neg], [effect_add, effect_rem])
238+
239+
return PDLL(init, [eat, bake], goal_test)

tests/test_planning.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,3 +34,25 @@ def test_air_cargo():
3434
p.act(action)
3535

3636
assert p.goal_test()
37+
38+
def test_spare_tire():
39+
p = spare_tire()
40+
assert p.goal_test() is False
41+
solution = [expr("Remove(Flat, Axle)"),
42+
expr("Remove(Spare, Trunk)"),
43+
expr("PutOn(Spare, Axle)")]
44+
45+
for action in solution:
46+
p.act(action)
47+
48+
def test_three_block_tower():
49+
p = three_block_tower()
50+
assert p.goal_test() is False
51+
solution = [expr("MoveToTable(C, A)"),
52+
expr("Move(B, Table, C)"),
53+
expr("Move(A, Table, B)")]
54+
55+
for action in solution:
56+
p.act(action)
57+
58+

0 commit comments

Comments
 (0)