=Overview
Abstract: Effective planning in the real world requires not only world knowledge, but the ability to leverage that knowledge to build the right representation of the task at hand. Decades of hierarchical planning techniques have used domain-specific temporal action abstractions to support efficient and accurate planning, almost always relying on human priors and domain knowledge to decompose hard tasks into smaller subproblems appropriate for a goal or set of goals. This paper describes Ada (Action Domain Acquisition), a framework for automatically constructing task-specific planning representations using task-general background knowledge from language models (LMs). Starting with a general-purpose hierarchical planner and a low-level goal-conditioned policy, Ada interactively learns a library of planner-compatible high-level action abstractions and low-level controllers adapted to a particular domain of planning tasks. On two language-guided interactive planning benchmarks (Mini Minecraft and ALFRED Household Tasks), Ada strongly outperforms other approaches that use LMs for sequential decision-making, offering more accurate plans and better generalization to complex tasks.
=Training
The training phase involves constructing task-specific planning representations by leveraging task-general background knowledge from language models. The framework learns high-level action abstractions and low-level controllers adapted to the domain of interest, enabling efficient and accurate planning.
=Inference
During inference, the system applies the learned representations and policies to solve complex planning tasks. It generalizes effectively to unseen scenarios, creating plans that adapt to task-specific requirements in real time.
=Learned Operator in the ALFRED Environment
(:action WashObject_2 :parameters (?a - agent ?l - location ?o - object ?toolreceptacle - receptacle) :precondition (and (atLocation ?a ?l) (objectAtLocation ?o ?l) (cleanable ?o) (receptacleType ?toolreceptacle SinkBasinType) (receptacleAtLocation ?toolreceptacle ?l) ) :effect (and (isClean ?o) ) )
(:action TurnOnLight_0 :parameters (?a - agent ?l - location ?o - object) :precondition (and (atLocation ?a ?l) (objectAtLocation ?o ?l) (toggleable ?o) (not (isToggled ?o)) ) :effect (and (isToggled ?o) ) )
(:action PickupObjectNotInReceptacle :parameters (?a - agent ?l - location ?o - object) :precondition (and (atLocation ?a ?l) (objectAtLocation ?o ?l) (not (holdsAny ?a)) (forall (?re - receptacle) (not (inReceptacle ?o ?re)) ) ) :effect (and (not (objectAtLocation ?o ?l)) (holds ?a ?o) (holdsAny ?a) ) )
(:action UseObject_1 :parameters (?toolreceptacle - receptacle ?a - agent ?l - location ?o - object) :precondition (and (receptacleType ?toolreceptacle FridgeType) (atLocation ?a ?l) (receptacleAtLocation ?toolreceptacle ?l) (holds ?a ?o) ) :effect (and (isCool ?o) ) )
(:action PickupObjectInReceptacle :parameters (?a - agent ?l - location ?o - object ?r - receptacle) :precondition (and (atLocation ?a ?l) (objectAtLocation ?o ?l) (inReceptacle ?o ?r) (not (holdsAny ?a)) ) :effect (and (not (objectAtLocation ?o ?l)) (not (inReceptacle ?o ?r)) (holds ?a ?o) (holdsAny ?a) ) )
(:action ChopObject_1 :parameters (?toolobject - object ?a - agent ?l - location ?o - object) :precondition (and (objectType ?toolobject ButterKnifeType) (atLocation ?a ?l) (objectAtLocation ?o ?l) (sliceable ?o) (holds ?a ?toolobject) ) :effect (and (isSliced ?o) ) )
(:action PutObjectInReceptacle :parameters (?a - agent ?l - location ?ot - otype ?o - object ?r - receptacle) :precondition (and (atLocation ?a ?l) (receptacleAtLocation ?r ?l) (objectType ?o ?ot) (holds ?a ?o) (not (holdsAnyReceptacleObject ?a)) ) :effect (and (inReceptacle ?o ?r) (not (holds ?a ?o)) (not (holdsAny ?a)) (objectAtLocation ?o ?l) ) )
(:action CookObject_1 :parameters (?toolreceptacle - receptacle ?a - agent ?l - location ?o - object) :precondition (and (receptacleType ?toolreceptacle MicrowaveType) (atLocation ?a ?l) (receptacleAtLocation ?toolreceptacle ?l) (holds ?a ?o) ) :effect (and (isHot ?o) ) )
(:action CutObject_0 :parameters (?toolobject - object ?a - agent ?l - location ?o - object) :precondition (and (objectType ?toolobject KnifeType) (atLocation ?a ?l) (objectAtLocation ?o ?l) (sliceable ?o) (holds ?a ?toolobject) ) :effect (and (isSliced ?o) ) )
(:action SliceObject_2 :parameters (?a - agent ?l - location ?o - object ?toolreceptacle - object) :precondition (and (atLocation ?a ?l) (objectAtLocation ?o ?l) (sliceable ?o) (holds ?a ?toolreceptacle) ) :effect (and (isSliced ?o) ) )
=Learned Operator in the Mini-Mine Environment
(:action mine-iron-ore :parameters (?toolinv - inventory ?targetinv - inventory ?x - object ?tool - object ?target - object ?t - tile) :precondition (and (agent-at ?t) (object-at ?x ?t) (object-of-type ?x IronOreVein) (inventory-holding ?toolinv ?tool) (object-of-type ?tool Pickaxe) (inventory-empty ?targetinv) (object-of-type ?target Hypothetical) ) :effect (and (not (inventory-empty ?targetinv)) (inventory-holding ?targetinv ?target) (not (object-of-type ?target Hypothetical)) (object-of-type ?target IronOre) ) )
(:action mine-wood_2 :parameters (?t - tile ?x - object ?toolinv - inventory ?tool - object ?targetinv - inventory ?target - object) :precondition (and (agent-at ?t) (object-at ?x ?t) (object-of-type ?x Tree) (inventory-holding ?toolinv ?tool) (object-of-type ?tool Axe) (inventory-empty ?targetinv) (object-of-type ?target Hypothetical) ) :effect (and (not (inventory-empty ?targetinv)) (inventory-holding ?targetinv ?target) (not (object-of-type ?target Hypothetical)) (object-of-type ?target Wood) ) )
(:action mine-wool1_0 :parameters (?t - tile ?x - object ?toolinv - inventory ?tool - object ?targetinv - inventory ?target - object) :precondition (and (agent-at ?t) (object-at ?x ?t) (object-of-type ?x Sheep) (inventory-holding ?toolinv ?tool) (object-of-type ?tool Shears) (inventory-empty ?targetinv) (object-of-type ?target Hypothetical) ) :effect (and (not (inventory-empty ?targetinv)) (inventory-holding ?targetinv ?target) (not (object-of-type ?target Hypothetical)) (object-of-type ?target Wool) ) )
(:action mine-potato_0 :parameters (?t - tile ?x - object ?targetinv - inventory ?target - object) :precondition (and (agent-at ?t) (object-at ?x ?t) (object-of-type ?x PotatoPlant) (inventory-empty ?targetinv) (object-of-type ?target Hypothetical) ) :effect (and (not (inventory-empty ?targetinv)) (inventory-holding ?targetinv ?target) (not (object-of-type ?target Hypothetical)) (object-of-type ?target Potato) ) )
(:action mine-sugar-cane_2 :parameters (?t - tile ?x - object ?toolinv - inventory ?tool - object ?targetinv - inventory ?target - object) :precondition (and (agent-at ?t) (object-at ?x ?t) (object-of-type ?x SugarCanePlant) (inventory-holding ?toolinv ?tool) (object-of-type ?tool Axe) (inventory-empty ?targetinv) (object-of-type ?target Hypothetical) ) :effect (and (not (inventory-empty ?targetinv)) (inventory-holding ?targetinv ?target) (not (object-of-type ?target Hypothetical)) (object-of-type ?target SugarCane) ) )
(:action mine-beetroot_1 :parameters (?t - tile ?x - object ?toolinv - inventory ?tool - object ?targetinv - inventory ?target - object) :precondition (and (agent-at ?t) (object-at ?x ?t) (object-of-type ?x BeetrootCrop) (inventory-holding ?toolinv ?tool) (inventory-empty ?targetinv) (object-of-type ?target Hypothetical) ) :effect (and (not (inventory-empty ?targetinv)) (inventory-holding ?targetinv ?target) (not (object-of-type ?target Hypothetical)) (object-of-type ?target Beetroot) ) )
(:action mine-feather_1 :parameters (?t - tile ?x - object ?toolinv - inventory ?tool - object ?targetinv - inventory ?target - object) :precondition (and (agent-at ?t) (object-at ?x ?t) (object-of-type ?x Chicken) (inventory-holding ?toolinv ?tool) (object-of-type ?tool Sword) (inventory-empty ?targetinv) (object-of-type ?target Hypothetical) ) :effect (and (not (inventory-empty ?targetinv)) (inventory-holding ?targetinv ?target) (not (object-of-type ?target Hypothetical)) (object-of-type ?target Feather) ) )
(:action mine-cobblestone_2 :parameters (?t - tile ?x - object ?toolinv - inventory ?tool - object ?targetinv - inventory ?target - object) :precondition (and (agent-at ?t) (object-at ?x ?t) (object-of-type ?x CobblestoneStash) (inventory-holding ?toolinv ?tool) (object-of-type ?tool Pickaxe) (inventory-empty ?targetinv) (object-of-type ?target Hypothetical) ) :effect (and (not (inventory-empty ?targetinv)) (inventory-holding ?targetinv ?target) (not (object-of-type ?target Hypothetical)) (object-of-type ?target Cobblestone) ) )
(:action mine-gold-ore1_2 :parameters (?t - tile ?x - object ?toolinv - inventory ?tool - object ?targetinv - inventory ?target - object) :precondition (and (agent-at ?t) (object-at ?x ?t) (object-of-type ?x GoldOreVein) (inventory-holding ?toolinv ?tool) (object-of-type ?tool Pickaxe) (inventory-empty ?targetinv) (object-of-type ?target Hypothetical) ) :effect (and (not (inventory-empty ?targetinv)) (inventory-holding ?targetinv ?target) (not (object-of-type ?target Hypothetical)) (object-of-type ?target GoldOre) ) )
(:action mine-coal1_0 :parameters (?t - tile ?x - object ?toolinv - inventory ?tool - object ?targetinv - inventory ?target - object) :precondition (and (agent-at ?t) (object-at ?x ?t) (object-of-type ?x CoalOreVein) (inventory-holding ?toolinv ?tool) (object-of-type ?tool Pickaxe) (inventory-empty ?targetinv) (object-of-type ?target Hypothetical) ) :effect (and (not (inventory-empty ?targetinv)) (inventory-holding ?targetinv ?target) (not (object-of-type ?target Hypothetical)) (object-of-type ?target Coal) ) )
(:action mine-beetroot1_0 :parameters (?t - tile ?x - object ?targetinv - inventory ?target - object) :precondition (and (agent-at ?t) (object-at ?x ?t) (object-of-type ?x BeetrootCrop) (inventory-empty ?targetinv) (object-of-type ?target Hypothetical) ) :effect (and (not (inventory-empty ?targetinv)) (inventory-holding ?targetinv ?target) (not (object-of-type ?target Hypothetical)) (object-of-type ?target Beetroot) ) )
(:action craft-wood-plank :parameters (?ingredientinv1 - inventory ?targetinv - inventory ?station - object ?ingredient1 - object ?target - object ?t - tile) :precondition (and (agent-at ?t) (object-at ?station ?t) (object-of-type ?station WorkStation) (inventory-holding ?ingredientinv1 ?ingredient1) (object-of-type ?ingredient1 Wood) (inventory-empty ?targetinv) (object-of-type ?target Hypothetical) ) :effect (and (not (inventory-empty ?targetinv)) (inventory-holding ?targetinv ?target) (not (object-of-type ?target Hypothetical)) (object-of-type ?target WoodPlank) (not (inventory-holding ?ingredientinv1 ?ingredient1)) (inventory-empty ?ingredientinv1) (not (object-of-type ?ingredient1 Wood)) (object-of-type ?ingredient1 Hypothetical) ) ) )
(:action craft-arrow :parameters (?ingredientinv1 - inventory ?ingredientinv2 - inventory ?targetinv - inventory ?station - object ?ingredient1 - object ?ingredient2 - object ?target - object ?t - tile) :precondition (and (agent-at ?t) (object-at ?station ?t) (object-of-type ?station WorkStation) (inventory-holding ?ingredientinv1 ?ingredient1) (object-of-type ?ingredient1 Stick) (inventory-holding ?ingredientinv2 ?ingredient2) (object-of-type ?ingredient2 Feather) (inventory-empty ?targetinv) (object-of-type ?target Hypothetical) ) :effect (and (not (inventory-empty ?targetinv)) (inventory-holding ?targetinv ?target) (not (object-of-type ?target Hypothetical)) (object-of-type ?target Arrow) (not (inventory-holding ?ingredientinv1 ?ingredient1)) (inventory-empty ?ingredientinv1) (not (object-of-type ?ingredient1 Stick)) (object-of-type ?ingredient1 Hypothetical) (not (inventory-holding ?ingredientinv2 ?ingredient2)) (inventory-empty ?ingredientinv2) (not (object-of-type ?ingredient2 Feather)) (object-of-type ?ingredient2 Hypothetical) ) ) )
(:action craft-beetroot-soup :parameters (?t - tile ?station - object ?ingredientinv1 - inventory ?ingredient1 - object ?ingredientinv2 - inventory ?ingredient2 - object ?targetinv - inventory ?target - object) :precondition (and (agent-at ?t) (object-at ?station ?t) (object-of-type ?station WorkStation) (inventory-holding ?ingredientinv1 ?ingredient1) (object-of-type ?ingredient1 Beetroot) (inventory-holding ?ingredientinv2 ?ingredient2) (object-of-type ?ingredient2 Bowl) (inventory-empty ?targetinv) (object-of-type ?target Hypothetical) ) :effect (and (not (inventory-empty ?targetinv)) (inventory-holding ?targetinv ?target) (not (object-of-type ?target Hypothetical)) (object-of-type ?target BeetrootSoup) (not (inventory-holding ?ingredientinv1 ?ingredient1)) (inventory-empty ?ingredientinv1) (not (object-of-type ?ingredient1 Beetroot)) (object-of-type ?ingredient1 Hypothetical) (not (inventory-holding ?ingredientinv2 ?ingredient2)) (inventory-empty ?ingredientinv2) (not (object-of-type ?ingredient2 Bowl)) (object-of-type ?ingredient2 Hypothetical) ) )
(:action craft-paper_0 :parameters (?t - tile ?station - object ?ingredientinv1 - inventory ?ingredient1 - object ?targetinv - inventory ?target - object) :precondition (and (agent-at ?t) (object-at ?station ?t) (object-of-type ?station WorkStation) (inventory-holding ?ingredientinv1 ?ingredient1) (object-of-type ?ingredient1 SugarCane) (inventory-empty ?targetinv) (object-of-type ?target Hypothetical) ) :effect (and (not (inventory-empty ?targetinv)) (inventory-holding ?targetinv ?target) (not (object-of-type ?target Hypothetical)) (object-of-type ?target Paper) (not (inventory-holding ?ingredientinv1 ?ingredient1)) (inventory-empty ?ingredientinv1) (not (object-of-type ?ingredient1 SugarCane)) (object-of-type ?ingredient1 Hypothetical) ) )
(:action craft-shears2_2 :parameters (?t - tile ?station - object ?ingredientinv1 - inventory ?ingredient1 - object ?targetinv - inventory ?target - object) :precondition (and (agent-at ?t) (object-at ?station ?t) (object-of-type ?station WorkStation) (inventory-holding ?ingredientinv1 ?ingredient1) (object-of-type ?ingredient1 GoldIngot) (inventory-empty ?targetinv) (object-of-type ?target Hypothetical) ) :effect (and (not (inventory-empty ?targetinv)) (inventory-holding ?targetinv ?target) (not (object-of-type ?target Hypothetical)) (object-of-type ?target Shears) (not (inventory-holding ?ingredientinv1 ?ingredient1)) (inventory-empty ?ingredientinv1) (not (object-of-type ?ingredient1 GoldIngot)) (object-of-type ?ingredient1 Hypothetical) ) )
(:action craft-bowl_1 :parameters (?t - tile ?station - object ?ingredientinv1 - inventory ?ingredient1 - object ?ingredientinv2 - inventory ?ingredient2 - object ?targetinv - inventory ?target - object) :precondition (and (agent-at ?t) (object-at ?station ?t) (object-of-type ?station WorkStation) (inventory-holding ?ingredientinv1 ?ingredient1) (object-of-type ?ingredient1 WoodPlank) (inventory-holding ?ingredientinv2 ?ingredient2) (object-of-type ?ingredient2 WoodPlank) (inventory-empty ?targetinv) (object-of-type ?target Hypothetical) ) :effect (and (not (inventory-empty ?targetinv)) (inventory-holding ?targetinv ?target) (not (object-of-type ?target Hypothetical)) (object-of-type ?target Bowl) (not (inventory-holding ?ingredientinv1 ?ingredient1)) (inventory-empty ?ingredientinv1) (not (object-of-type ?ingredient1 WoodPlank)) (object-of-type ?ingredient1 Hypothetical) (not (inventory-holding ?ingredientinv2 ?ingredient2)) (inventory-empty ?ingredientinv2) (not (object-of-type ?ingredient2 WoodPlank)) (object-of-type ?ingredient2 Hypothetical) ) )
(:action craft-boat_0 :parameters (?t - tile ?station - object ?ingredientinv - inventory ?ingredient - object ?targetinv - inventory ?target - object) :precondition (and (agent-at ?t) (object-at ?station ?t) (object-of-type ?station WorkStation) (inventory-holding ?ingredientinv ?ingredient) (object-of-type ?ingredient WoodPlank) (inventory-empty ?targetinv) (object-of-type ?target Hypothetical) ) :effect (and (not (inventory-empty ?targetinv)) (inventory-holding ?targetinv ?target) (not (object-of-type ?target Hypothetical)) (object-of-type ?target Boat) (not (inventory-holding ?ingredientinv ?ingredient)) (inventory-empty ?ingredientinv) (not (object-of-type ?ingredient WoodPlank)) (object-of-type ?ingredient Hypothetical) ) )
(:action craft-cooked-potato_1 :parameters (?t - tile ?station - object ?ingredientinv1 - inventory ?ingredient1 - object ?ingredientinv2 - inventory ?ingredient2 - object ?targetinv - inventory ?target - object) :precondition (and (agent-at ?t) (object-at ?station ?t) (object-of-type ?station WorkStation) (inventory-holding ?ingredientinv1 ?ingredient1) (object-of-type ?ingredient1 Potato) (inventory-holding ?ingredientinv2 ?ingredient2) (object-of-type ?ingredient2 Coal) (inventory-empty ?targetinv) (object-of-type ?target Hypothetical) ) :effect (and (not (inventory-empty ?targetinv)) (inventory-holding ?targetinv ?target) (not (object-of-type ?target Hypothetical)) (object-of-type ?target CookedPotato) (not (inventory-holding ?ingredientinv1 ?ingredient1)) (inventory-empty ?ingredientinv1) (not (object-of-type ?ingredient1 Potato)) (object-of-type ?ingredient1 Hypothetical) (not (inventory-holding ?ingredientinv2 ?ingredient2)) (inventory-empty ?ingredientinv2) (not (object-of-type ?ingredient2 Coal)) (object-of-type ?ingredient2 Hypothetical) ) )
(:action craft-gold-ingot_1 :parameters (?t - tile ?station - object ?ingredientinv1 - inventory ?ingredient1 - object ?ingredientinv2 - inventory ?ingredient2 - object ?targetinv - inventory ?target - object) :precondition (and (agent-at ?t) (object-at ?station ?t) (object-of-type ?station WorkStation) (inventory-holding ?ingredientinv1 ?ingredient1) (object-of-type ?ingredient1 GoldOre) (inventory-holding ?ingredientinv2 ?ingredient2) (object-of-type ?ingredient2 Coal) (inventory-empty ?targetinv) (object-of-type ?target Hypothetical) ) :effect (and (not (inventory-empty ?targetinv)) (inventory-holding ?targetinv ?target) (not (object-of-type ?target Hypothetical)) (object-of-type ?target GoldIngot) (not (inventory-holding ?ingredientinv1 ?ingredient1)) (inventory-empty ?ingredientinv1) (not (object-of-type ?ingredient1 GoldOre)) (object-of-type ?ingredient1 Hypothetical) (not (inventory-holding ?ingredientinv2 ?ingredient2)) (inventory-empty ?ingredientinv2) (not (object-of-type ?ingredient2 Coal)) (object-of-type ?ingredient2 Hypothetical) ) )
(:action craft-stick_0 :parameters (?t - tile ?station - object ?ingredientinv1 - inventory ?ingredient1 - object ?targetinv - inventory ?target - object) :precondition (and (agent-at ?t) (object-at ?station ?t) (object-of-type ?station WorkStation) (inventory-holding ?ingredientinv1 ?ingredient1) (object-of-type ?ingredient1 WoodPlank) (inventory-empty ?targetinv) (object-of-type ?target Hypothetical) ) :effect (and (not (inventory-empty ?targetinv)) (inventory-holding ?targetinv ?target) (not (object-of-type ?target Hypothetical)) (object-of-type ?target Stick) (not (inventory-holding ?ingredientinv1 ?ingredient1)) (inventory-empty ?ingredientinv1) (not (object-of-type ?ingredient1 WoodPlank)) (object-of-type ?ingredient1 Hypothetical) ) )
(:action craft-sword_0 :parameters (?t - tile ?station - object ?ingredientinv1 - inventory ?ingredient1 - object ?ingredientinv2 - inventory ?ingredient2 - object ?targetinv - inventory ?target - object) :precondition (and (agent-at ?t) (object-at ?station ?t) (object-of-type ?station WorkStation) (inventory-holding ?ingredientinv1 ?ingredient1) (object-of-type ?ingredient1 Stick) (inventory-holding ?ingredientinv2 ?ingredient2) (object-of-type ?ingredient2 IronIngot) (inventory-empty ?targetinv) (object-of-type ?target Hypothetical) ) :effect (and (not (inventory-empty ?targetinv)) (inventory-holding ?targetinv ?target) (not (object-of-type ?target Hypothetical)) (object-of-type ?target Sword) (not (inventory-holding ?ingredientinv1 ?ingredient1)) (inventory-empty ?ingredientinv1) (not (object-of-type ?ingredient1 Stick)) (object-of-type ?ingredient1 Hypothetical) (not (inventory-holding ?ingredientinv2 ?ingredient2)) (inventory-empty ?ingredientinv2) (not (object-of-type ?ingredient2 IronIngot)) (object-of-type ?ingredient2 Hypothetical) ) )
(:action craft-bed_1 :parameters (?t - tile ?station - object ?ingredientinv1 - inventory ?ingredient1 - object ?ingredientinv2 - inventory ?ingredient2 - object ?targetinv - inventory ?target - object) :precondition (and (agent-at ?t) (object-at ?station ?t) (object-of-type ?station WorkStation) (inventory-holding ?ingredientinv1 ?ingredient1) (object-of-type ?ingredient1 WoodPlank) (inventory-holding ?ingredientinv2 ?ingredient2) (object-of-type ?ingredient2 Wool) (inventory-empty ?targetinv) (object-of-type ?target Hypothetical) ) :effect (and (not (inventory-empty ?targetinv)) (inventory-holding ?targetinv ?target) (not (object-of-type ?target Hypothetical)) (object-of-type ?target Bed) (not (inventory-holding ?ingredientinv1 ?ingredient1)) (inventory-empty ?ingredientinv1) (not (object-of-type ?ingredient1 WoodPlank)) (object-of-type ?ingredient1 Hypothetical) (not (inventory-holding ?ingredientinv2 ?ingredient2)) (inventory-empty ?ingredientinv2) (not (object-of-type ?ingredient2 Wool)) (object-of-type ?ingredient2 Hypothetical) ) )
(:action craft-iron-ingot_2 :parameters (?t - tile ?station - object ?ingredientinv1 - inventory ?ingredient1 - object ?ingredientinv2 - inventory ?ingredient2 - object ?targetinv - inventory ?target - object) :precondition (and (agent-at ?t) (object-at ?station ?t) (object-of-type ?station WorkStation) (inventory-holding ?ingredientinv1 ?ingredient1) (object-of-type ?ingredient1 IronOre) (inventory-holding ?ingredientinv2 ?ingredient2) (object-of-type ?ingredient2 Coal) (inventory-empty ?targetinv) (object-of-type ?target Hypothetical) ) :effect (and (not (inventory-empty ?targetinv)) (inventory-holding ?targetinv ?target) (not (object-of-type ?target Hypothetical)) (object-of-type ?target IronIngot) (not (inventory-holding ?ingredientinv1 ?ingredient1)) (inventory-empty ?ingredientinv1) (not (object-of-type ?ingredient1 IronOre)) (object-of-type ?ingredient1 Hypothetical) (not (inventory-holding ?ingredientinv2 ?ingredient2)) (inventory-empty ?ingredientinv2) (not (object-of-type ?ingredient2 Coal)) (object-of-type ?ingredient2 Hypothetical) ) )