SlowGuess/NeurIPS_2023_OCR huggingface dataset:
near('spoon_1')   
near('fork_1')   
[[Trajectories:]]   
\* In [Scenario 1], at state 1-3, the robot brought spoon_1 and fork_1 from countertop_1 to the sink_1.   
\* At state 3-4, turned on tap_1   
\* At state 3-4, soaped fork_1 until it became soapy   
\* At state 4-5, soaped spoon_1 until it became soapy   
\* At state 5-6, rinsed spoon_1 until it became clean.   
\* At state 6-7, rinsed fork_1 until it became clean.   
\* At state 7-8, turned off tap_1, and placed spoon_1 and fork_1 in sink_1.   
<end_of_example_user_query>   
[[Reasoning:]]   
\* There are 2 dishes that got washed: [fork_1, spoon_1]   
\* The list of high level actions that happened in order is: [ move dishes from A to B, turn on tap, soap, soap, rinse, rinse, turn off tap, placed dishes in sink_1]   
\* Because in [soap, soap], the high-level action of soapping got repeated twice (once for each dish we brought) we can use a for-loop.   
\* Because in [rinse, rinse], the high-level action rinsing gets repeated twice (once for each dish), we can use a for-loop.   
\* Since the dishes can be kept in hand, there is no place and pick up before soaping or rinsing.   
\* Rinsing involves the use of tap water, which is why it was turned on at some point before the rinse cycle, and turned off after.   
[[Task Specification:]]   
Wash objects at a sink. All cleaned objects should be placed in the sink.   
Specifically -   
Get a list of all objects to wash Bring all objects from countertop_1 to sink_1 Turn on tap For each object Soap object For each object Rinse object Turn off tap For each object Place object in sink_1 [[end of response]]   
- [High-Level Goal:]]   
Wash objects at a sink. All cleaned objects should be placed in the sink. Objects to clean - spoon_1 at countertop_1 - fork_1 at countertop_1   
Initial Condition (State 1): in('spoon_1', 'dishwasher_1') in('plate_1', 'sink_1') in('plate_2', 'sink_1') [[Trajectories:]] \* In [Scenario 1], at state 1-3, brought spoon_1 from dishwasher_1 to sink_1   
\* At state 3-4, turned on tap_1.   
\* At state 4-6, soaped spoon_1 until it became soapy   
\* At state 6-7, rinsed spoon_1 until it became clean   
\* At state 7-8, placed spoon_1 in sink_1   
\* At state 8-9, turned off tap_1 and picked up plate_1   
\* At state 9-10, turned on tap_1.
\*At state 10-11, soaped plate_1 until it became soapy   
\*At state 11-12, rinsed plate_1 until it became clean   
\*At state 12-13, placed plate_1 in sink_1   
\*At state 13-15, turned off tap_1 and picked up plate_2   
\*At state 15-16, turned on tap_1   
\*At state 16-18, soaped plate_2 until it became soapy   
\*At state 18-19, rinsed plate_2 until it became clean, turned off tap_1, and placed plate_2 in sink_1   
<end_of_example_user_query>   
[[Reasoning:]]   
\*There are 3 dishes got washed: [spoon_1, plate_1, plate_2]   
\*The list of high level actions that happened in order is: [ move dish from A to B, turn on tap, soap, rinse, place, turn off tap, pick up, turn on tap, soap, rinse, place, turn off tap, pick up, turn on tap, soap, rinse, place, turn off tap]   
\*Only spoon_1 is brought to the sink from the dishwasher, other dishes are already in the sink.   
\*The spoon_1 does not have a pick_up action associated with it because its already in hand when brought from dishwasher_1 to sink_1. The action can be added to the code for generalizing without a side effect.   
\*The actions [pick_up, turn on tap, soap, rinse, place, turn off tap] are repeated for each dish, so we can use a loop.   
\*Rinsing involves the use of tap water, which is why it is turned on at some point before the rinse cycle, and turned off after.   
[[Task Specification:]]   
Wash objects at a sink. All cleaned objects should be placed in the sink. Specifically -   
Get a list of all objects to wash Bring all objects to sink_1 For each object in all objects: Pick_up object Turn on tap_1 Soap object Rinse object Place object in sink_1 Turn off tap_1 [[end of response]]
18.3.2 Recursive Expansion
spec_2_highlevelcode:   
main: | You are a Python code generator for robotics. The users will first provide the imported Python modules. Then, for each code they want you to generate, they provide the requirements and pseudocode in Python docstrings. <end_of_system_message> You need to write robot control scripts in Python code. The Python code should be general and applicable to different environments. Below are the imported Python libraries and functions that you can use. You CANNOT import new libraries. #Python kitchen robot control script from env_utils import get_all Objects from robot_utils import bringobjects_to_location, turn_off, turn_on, soap, rinse, pick_up, place, go_to, clean_with
>>> "All the code should follow the specification. Follow descriptions when writing code.
Specifications:
get_all Objects()
Return:
    (list) a list of string of objects that need to be cleaned
bring_objects_to_location(obj, loc)
involves calling pick_up, go_to and place within the function.
Parameters:
obj (List[str]): Strings of the form "object_id" (e.g. "plate_1") that need to be brought to the location loc
loc(obj): location string of the form "loc_id" (e.g. "sink_1")
Return:
    (void)
turn_off(tap_name)
turns off tap
Parameters:
    tap_name (str): A string that has the type of a tap (must be 'tap') and an id. For example: 'tap1', 'tap2'
turn_on(tap_name)
turns on tap
Parameters:
    tap_name (str): A string that has the type of a tap (must be 'tap') and an id. For example: 'tap1', 'tap2'
soap(obj)
soap the object "obj". It must be in hand before calling this function.
Parameters:
obj (str): String of the form "object_id" (e.g. "plate_1")
that needs to be saoped
rinse(obj)
rinses the object "obj". It must be in hand before calling this function, tap must be turned on before calling this function, and switched off after
Parameters:
obj (str): String of the form "object_id" (e.g. "plate_1")
that needs to be rinsed
pick_up(obj)
Parameters:
obj (str): String of the form "object_id" (e.g. "plate_1")
to pick up
place(obj, loc)
Parameters:
obj (str): String of the form "object_id" (e.g. "plate_1")
to pick up
loc (str): Location string (e.g. "sink_1") where obj is to be placed
go_to(loc):
Parameters:
loc (str): Location string (e.g. "sink_1") to go to from current location.
clean_with(obj, tool)
Parameters:
obj (str): Object strings (e.g. "plate") to clean
tool (str): Tool strings (e.g. "sponge" or "towel") to clean with
You must follow these rules when you are generating Python code. * You MUST ONLY use Python library functions imported above. You MUST follow the docstrings and specifications for these functions. * You CANNOT call define new functions. You CANNOT use functions that are NOT imported above. * You must follow the instructions provided by the user. You CANNOT add additional steps, conditionals, or loops that are not in the instruction.  
examples:  
- !  
...  
```
```
Wash objects at a sink. All cleaned objects should be placed in the sink. Specifically -  
Get a list of all objects to wash  
Bring all objects from countertop_1 to sink_1  
Turn on tap_1  
For each object  
Soap object  
For each object  
Rinse object  
Turn off tap_1  
For each object  
Place object in sink_1  
```
...
<end_of_user_query>
...  
objects = get_all Objects()  
bring_objects_to_location(objects, "sink_1")  
turn_on("tap_1")  
for object in objects:  
soap(object)  
for object in objects:  
rinse(object)  
turn_off("tap_1")  
for object in objects:  
place(object, "sink_1")  
...
- ! 
... 
```
```
Wash objects at a sink. All cleaned objects should be placed in the sink. Specifically -  
Get a list of all objects to wash  
Bring all objects to sink_1  
For each object in all objects:  
Pick_up object  
Turn on tap_1  
Soap object  
Rinse object  
Place object in sink_1  
Turn off tap_1
```
...
<end_of_user_query>
...  
objects = get_all Objects()  
bring_objects_to_location(objects, "sink_1")  
for object in objects:
pick_up(object)  
turn_on("tap_1")  
soap(object)  
rinse(object)  
place(object, "sink_1")  
turn_off("tap_1")
19 Other Long Examples
19.1 Example Robotouille Query
'patty1' is not at 'table1'  
'robot1' is holding 'patty1'
'robot1' is at 'stove2'  
'robot1' is not at 'table1'
'patty1' is at 'stove2'  
'robot1' is not holding 'patty1'
'patty1' is cooked
'patty1' is not at 'stove2'  
'robot1' is holding 'patty1'
'robot1' is not at 'stove2'  
'robot1' is at 'table3'
'patty1' is at 'table3'  
'patty1' is on top of 'bottom_bun1'  
'robot1' is not holding 'patty1'
'robot1' is not at 'table3'  
'robot1' is at 'table6'
'tomato1' is not at 'table6'  
'robot1' is holding 'tomato1'
State 14: 'robot1' is not at 'table6' 'robot1' is at 'cutting_board1'
State 15: 'tomato1' is at 'cutting_board1' 'robot1' is not holding 'tomato1'
State 17:
State 18: 'tomato1' is cut
State 19: 'tomato1' is not at 'cutting_board1' 'robot1' is holding 'tomato1'
State 20: 'robot1' is at 'table3' 'robot1' is not at 'cutting_board1'
State 21:  
'tomato1' is at 'table3'  
'tomato1' is on top of 'patty1'  
'robot1' is not holding 'tomato1'
State 22:  
'robot1' is at 'table5'  
'robot1' is not at 'table3'
State 23: 'lettuce1' is not at 'table5' 'robot1' is holding 'lettuce1'
State 24: 'robot1' is not at 'table5' 'robot1' is at 'cutting_board1'
State 25: 'lettuce1' is at 'cutting_board1' 'robot1' is not holding 'lettuce1'
State 26:
State 27:
State 28: 'lettuce1' is cut
State 29: 'lettuce1' is not at 'cutting_board1' 'robot1' is holding 'lettuce1'
State 30: 'robot1' is at 'table3' 'robot1' is not at 'cutting_board1'
State 31: 'lettuce1' is at 'table3'
'lettuce1' is on top of 'tomato1'  
'robot1' is not holding 'lettuce1'
State 32: 'robot1' is at 'table4' 'robot1' is not at 'table3'
State 33: 'top_bun1' is not at 'table4' 'robot1' is holding 'top_bun1'
State 34: 'robot1' is not at 'table4' 'robot1' is at 'table3'
State 35: 'top_bun1' is at 'table3' 'top_bun1' is on top of 'lettuce1' 'robot1' is not holding 'top_bun1'
[Scenario 2]  
Make a burger.
State 2: 'patty3' is not at 'table6' 'robot1' is holding 'patty3'
State 3: 'robot1' is at 'stove3' 'robot1' is not at 'table6'
State 4:  
'patty3' is at 'stove3'  
'robot1' is not holding 'patty3'
State 8: 'patty3' is cooked  
State 9: 'patty3' is not at 'stove3' 'robot1' is holding 'patty3'
State 10: 'robot1' is not at 'stove3' 'robot1' is at 'table5'
State 11:  
'patty3' is at 'table5'  
'patty3' is on top of 'bottom_bun3'  
'robot1' is not holding 'patty3'
State 12: 'robot1' is at 'table3' 'robot1' is not at 'table5'
'tomato3' is not at 'table3'  
'robot1' is holding 'tomato3'
State 14: 'robot1' is not at 'table3' 'robot1' is at 'cutting_board3'
State 15: 'tomato3' is at 'cutting_board3' 'robot1' is not holding 'tomato3'
State 18: 'tomato3' is cut
State 19: 'tomato3' is not at 'cutting_board3' 'robot1' is holding 'tomato3'
State 20: 'robot1' is at 'table5' 'robot1' is not at 'cutting_board3'
State 21:  
'tomato3' is at 'table5'  
'tomato3' is on top of 'patty3'  
'robot1' is not holding 'tomato3'
State 22: 'robot1' is at 'table7' 'robot1' is not at 'table5'
State 23: 'lettuce3' is not at 'table7' 'robot1' is holding 'lettuce3'
State 24: 'robot1' is not at 'table7' 'robot1' is at 'cutting_board3'
State 25: 'lettuce3' is at 'cutting_board3' 'robot1' is not holding 'lettuce3'
State 28: 'lettuce3' is cut
State 29: 'lettuce3' is not at 'cutting_board3' 'robot1' is holding 'lettuce3'
State 30: 'robot1' is at 'table5' 'robot1' is not at 'cutting_board3'
State 31: 'lettuce3' is at 'table5' 'lettuce3' is on top of 'tomato3' 'robot1' is not holding 'lettuce3'
State 32: 'robot1' is at 'table9' 'robot1' is not at 'table5'
State 33: 'top_bun3' is not at 'table9' 'robot1' is holding 'top_bun3'
State 34: 'robot1' is not at 'table9' 'robot1' is at 'table5'
State 35: 'top_bun3' is at 'table5' 'top_bun3' is on top of 'lettuce3' 'robot1' is not holding 'top_bun3'
19.2 Example EPIC-Kitchens Query
```
[Scenario 1]
Wash objects in sink. All clean objects must be placed in drying rack.
Objects to clean
- mezzaluna_1 in sink_1
- peeler:potato_1 in sink_1
- knife_1 in sink_1
- board:cutting_1 in sink_1
Initial Condition (State 1):  
is_in_hand('sponge_1')  
in('mezzaluna_1', 'sink_1')  
at('sink_1')
State 2:  
is_in_hand('mezzaluna_1')  
dirty('mezzaluna_1')
State 3: is(soapy('mezzaluna_1'))
State 4:  
in('mezzaluna_1', 'sink_2')
State 5:  
in('peeler:potato_1', 'sink_1')
State 6: is_in_hand('peeler:potato_1')
State 7: is(soapy('peeler:potato_1')
State 8:  
in('peeler:potato_1', 'sink_2')
State 9:  
in('knife_1', 'sink_1')
State 10: is_in_hand('knife_1')
State 11: is(soapy('knife_1'))
State 12:  
in('knife_1', 'sink_2')
State 13:  
in('board:cutting_1', 'sink_1')
State 14: is_in_hand('board:cutting_1')
State 15: is.soapy('board:cutting_1')
State 16:  
in('board:cutting_1', 'sink_2')
State 17: is_on('tap_1')
State 18: is_in_hand('board:cutting_1')
State 19: is.clean(^board:cutting_1^)
State 20:  
in('board:cutting_1', 'dryingrack_1')
State 21: is_in_hand('mezzaluna_1')
State 22: is_clean('mezzaluna_1')
State 23:  
in('mezzaluna_1', 'dryingrack_1')
State 24: is_in_hand('peeler:potato_1')
State 25: is_clean('peeler:potato_1')
State 26:  
in('peeler:potato_1', 'dryingrack_1')
State 27: is_in_hand('knife_1')
State 28: is Cleaner('knife_1')
State 29: in('knife_1', 'dryingrack_1')
State 30: is_off('tap_1')
19.3 Intermediate Reasoning Ablation Helper Functions
19.3.1 No Reasoning Helper Functions
def move_thenth_unstack(obj_to_unstack, obj_at_bottom, unstack_location) : # For unstacking, we need to move to the location of the bottom object if get_curr_location() != get_obj_location(obj_at_bottom): move(get_curr_location(), get_obj_location(obj_at_bottom))   
5 stack(obj_to_unstack, obj_at_bottom)   
6 After unstacking, we need to move to the unstack_location if get_curr_location() != unstack_location: move(get_curr_location(), unstack_location)   
8   
9   
10 def move_thenth_pick(obj): obj_location = get_obj_location(obj) if get_curr_location() != obj_location: move(get_curr_location(), obj_location) pick_up(obj, obj_location)   
15   
16 def move_thenth_place(obj, place_location): if get_curr_location() != place_location: move(get_curr_location(), place_location) place(obj, place_location)   
20   
21 def cook_until_is_cooked(obj): start_cooking(obj) while not is_cooked(obj): noop()   
25   
26 def cook_object_at_location(obj, location): # To cook an object, the robot first needs to be holding obj if not is_holding(obj): # If the robot is not holding obj, there are 2 scenarios: # (1) if obj is in a stack ,unstack obj # (2) else, pick up obj. if is_in_a_stack(obj): # Because obj is in a stack, robot need to move then unstack the obj from the obj_at_bottom first obj_at_bottom = get_obj_that_is_underneath(obj_at_top=obj) move_thenth_unstack(obj_to_unstack=obj, obj_at_bottom= obj_at_bottom, unstack_location=get_obj_location(obj_at_bottom)) else: # Since obj is not in a stack, robot can just move then pick it up move_thenth_pick(obj=obj) # place the object at the location to cook at move_thenth_place(obj=obj, place_location=location) # cook the object cook_until_is_cooked(obj=obj)   
34   
35   
36   
37   
38   
39   
40   
41   
42   
43   
44 def cut_until_isCut(obj): while not isCut(obj): cut(obj)   
47   
48 def cut_object_at_location(obj, location): # To cut an object, the robot first needs to be holding obj if not is_holding(obj):
# If the robot is not holding obj, there are 2 scenarios: # (1) if obj is in a stack ,unstack obj # (2) else, pick up obj. if is_in_a_stack(obj): # Because obj is in a stack, robot need to move then unstack the obj from the obj_at_bottom first obj_at_bottom = get_obj_that_is_underneath(obj_at_top=obj) move_then_unstack(obj_to_unstack  $\equiv$  obj, obj_at_bottom= obj_at_bottom, unstack_location  $\equiv$  get_obj_location(obj_at_bottom)) else: # Since obj is not in a stack, robot can just move then pick it up move_then_pick(obj=obj) # place the object at the location to cut at move_then_place(obj=obj, place_location  $\equiv$  location) # cut the object cut_until_is.cut(obj=obj)   
def move_then_stack(obj_to_stack, obj_at_bottom, stack_location): if get_curr_location() != stack_location: move(get_curr_location(), stack_location) stack(obj_to_stack, obj_at_bottom)   
def stack_obj1_on_obj2(obj1, obj2): # To stack obj1 on obj2, the robot needs to be holding obj1 if not is_holding(obj1): # If the robot is not holding obj1, there are 2 scenarios: # (1) if obj1 is in a stack ,unstack obj1 # (2) else, pick up obj1. if is_in_a_stack(obj1): # Because obj1 is in a stack, robot need to move then unstack the obj from the obj_at_bottom first obj_at_bottom = get_obj那個_is_underneath(obj_at_top=obj1 ) move_then_unstack(obj_to_unstack  $\equiv$  obj1, obj_at_bottom= obj_at_bottom, unstack_location  $\equiv$  get_obj_location(obj_at_bottom)) else: # Since obj1 is not in a stack, robot can just move then pick it up move_then_pick(obj=obj1) # determine the location of obj2 to stack on obj2_location  $=$  get_obj_location(obj2) # move to obj2's location then stack obj1 on obj2 move_then_stack(obj_to_stack  $\equiv$  obj1, obj_at_bottom  $\equiv$  obj2, stack_location  $\equiv$  obj2_location)
19.3.2 Only List Helper Functions
1 def movethen_unstack(obj_to_unstack, obj_at_bottom, unstack_location) :   
2 # For unstacking, we need to move to the location of the bottom object   
3 if getCurr_location() != get_obj_location(obj_at_bottom):   
4 move(getCurr_location(), get_obj_location(obj_at_bottom))   
5 unstack(obj_to_unstack, obj_at_bottom)   
6 # After unstacking, we need to move to the unstack_location   
7 if getCurr_location() != unstack_location:   
8 move(getCurr_location(), unstack_location)   
9   
10 def move_thenth_pick(obj):   
11 obj_location = get_obj_location(obj)   
12 if getCurr_location() != obj_location:   
13 move(getCurr_location(), obj_location)
51   
52   
53   
54   
55   
56   
57   
58   
59   
60   
61   
62   
63   
64   
65   
66   
67   
68   
69   
70   
71   
72   
73   
74   
75   
76   
77   
78   
79   
80   
81   
82   
83   
84   
85   
86   
87
pick_up(obj, obj_location)   
def move_thenth_place(obj, place_location): if get_curr_location() != place_location: move(get_curr_location(), place_location) place(obj, place_location)   
def cook_until_is_cooked(obj): start_cooking(obj) while not is_cooked(obj): noop()   
def cook_object_at_location(obj, location): # To cook an object, the robot first needs to be holding obj if not is_holding(obj): # If the robot is not holding obj, there are 2 scenarios: # (1) if obj is in a stack ,unstack obj # (2) else, pick up obj. if is_in_a_stack(obj): # Because obj is in a stack, robot need to move then unstack the obj from the obj_at_bottom first obj_at_bottom = get_obj_that_is_underneath(obj_at_top=obj) movethen_unstack(obj_to_unstack=obj, obj_at_bottom= obj_at_bottom, unstack_location=get_obj_location(obj_at_bottom)) else: # Since obj is not in a stack, robot can just move then pick it up move_thenth_pick(obj=obj) # place the object at the location to cook at move_thenth_place(obj=obj, place_location=location) # cook the object cook_until_is_cooked(obj=obj)   
def move_thenth_stack(obj_to_stack, obj_at_bottom, stack_location): if get_curr_location() != stack_location: move(get_curr_location(), stack_location) stack(obj_to_stack, obj_at_bottom)   
def stack_obj1_on_obj2(obj1, obj2): # To stack obj1 on obj2, the robot needs to be holding obj1 if not is_holding(obj1): # If the robot is not holding obj1, there are 2 scenarios: # (1) if obj1 is in a stack ,unstack obj1 # (2) else, pick up obj1. if is_in_a_stack(obj1): # Because obj1 is in a stack, robot need to move then unstack the obj from the obj_at_bottom first obj_at_bottom = get_obj-that_is_underneath(obj_at_top=obj1 ) move_thenth_unstack(obj_to_unstack=obj1, obj_at_bottom= obj_at_bottom, unstack_location=get_obj_location(obj_at_bottom)) else: # Since obj1 is not in a stack, robot can just move then pick it up move_thenth_pick(obj=obj1) # determine the location of obj2 to stack on obj2_location = get_obj_location(obj2) # move to obj2's location then stack obj1 on obj2 move_thenth_stack(obj_to_stack=obj1, obj_at_bottom=obj2, stack_location=obj2_location)   
def move_to_location location): if get_curr_location() != location: move(get_curr_location(), location)
14   
15   
16   
17   
18   
19   
20   
21   
22   
23   
24   
25   
26   
27   
28   
29   
30   
31   
32   
33   
34   
35   
36   
37   
38   
39   
40   
41   
42   
43   
44   
45   
46   
47   
48   
49   
50   
51   
52   
53   
54   
55   
56   
57   
58   
59   
60   
61   
62   
63   
64   
65   
66   
67   
68   
69   
70
def cut_object(obj, location):  
    # To cut an object, the robot first needs to be holding obj  
    if not is_holding(obj):  
        # If the robot is not holding obj, there are 2 scenarios:  
            # (1) if obj is in a stack, unstack obj  
            # (2) else, pick up obj.  
        if is_in_a_stack(obj):  
            # Because obj is in a stack, robot need to move then  
            unstack the obj from the obj_at_bottom first  
            obj_at_bottom = get_obj_that_is_underneath(obj_at_top=obj)  
            moveThen_unstack(obj_to_unstack=obj, obj_at_bottom=obj_at_bottom, unstack_location=get_obj_location(obj_at_bottom))  
        else:  
            # Since obj is not in a stack, robot can just move then  
            pick it up  
            moveThen_pick(obj=obj)  
            # move to the location to cut at  
            move_to_location location=location)  
            # cut the object  
            cut(obj=obj)
19.3.3 Full Helper Functions
def move_thenth_unstack(obj_to_unstack, obj_at_bottom, unstack_location) : # For unstacking, we need to move to the location of the bottom object if getCurr_location() != get_obj_location(obj_at_bottom): move(getCurr_location(), get_obj_location(obj_at_bottom))   
5 unstack(obj_to_unstack, obj_at_bottom)   
6 # After unstacking, we need to move to the unstack_location if getCurr_location() != unstack_location: move(getCurr_location(), unstack_location)   
8   
9   
10 def move_thenth_pick(obj): obj_location = get_obj_location(obj) if getCurr_location() != obj_location: move(getCurr_location(), obj_location) pick_up(obj, obj_location)   
15   
16 def move_thenth_place(obj, place_location): if getCurr_location() != place_location: move(getCurr_location(), place_location) place(obj, place_location)   
19   
20   
21 def cook_until_is_cooked(obj): start_cooking(obj) while not is_cooked(obj): noop()   
25   
26 def cook_object_at_location(obj, location): # To cook an object, the robot first needs to be holding obj if not is_holding(obj): # If the robot is not holding obj, there are 2 scenarios: # (1) if obj is in a stack ,unstack obj # (2) else, pick up obj. if is_in_a_stack(obj): # Because obj is in a stack, robot need to move then unstack the obj from the obj_at_bottom first obj_at_bottom = get_obj_that_is_underneath(obj_at_top=obj) move_thenth_unstack(obj_to_unstack=obj, obj_at_bottom= obj_at_bottom, unstack_location=get_obj_location(obj_at_bottom)) else: