See also MealPlanningResources
Today (Mon Jan 10 08:37:38 CST 2011) generated the first sample cooking assistant plan. The actions are derived from the CURD annotated recipe corpus. There are a lot of problems in using these domains, however, as the planner seems ill-equipped to handle them, violating many default settings that cannot be recompiled without the source. Therefore only a small recipe worked.
Modality: Fast Planner Number of actions : 1635 Number of conditional actions : 0 Number of facts : 3224 Analyzing Planning Problem: Temporal Planning Problem: NO Numeric Planning Problem: YES Problem with Timed Initial Litearals: NO Problem with Derived Predicates: NO Evaluation function weights: Action duration 0.00; Action cost 1.00 Computing mutex... done Preprocessing total time: 0.20 seconds Searching ('.' = every 50 search steps): solution found: Plan computed: Time: (ACTION) [action Duration; action Cost] 0.0000: (COMBINE_3 ING21 ING18 ING19 ING20) [D:0.1000; C:1.0000] 0.1000: (PUT ING21 T4) [D:0.1000; C:1.0000] 0.2000: (MIX ING21 T4 ING22) [D:0.1000; C:1.0000] 0.3000: (CHECK ING22) [D:0.1000; C:1.0000] Solution found: Total time: 0.22 Search time: 0.02 Actions: 4 Execution cost: 4.00 Duration: 0.400 Plan quality: 4.000 Plan file: /var/lib/myfrdcsa/codebases/internal/verber/data/worldmodel/worlds/gourmet.p.pddl.LPG.sol_1.SOL No contents mv "/var/lib/myfrdcsa/codebases/internal/verber/data/worldmodel/worlds/gourmet.p.pddl.LPG.sol.SOL" "/var/lib/myfrdcsa/codebases/internal/verber/data/worldmodel/worlds/gourmet.p.pddl.LPG.sol"
The basic way this is going to work is by annotating recipes using a system trained on CURD into a CURD-like format, then converted into the style of the annotations they provide, then converted to the PDDL domain. Then the Interactive Execution Monitor will take over and walk the user through the preparation. This plan is not intended to be a complete representation, but simply to work with the available representation as a starting point. Addition of cooking times and finer-grained details about the cooking actions, such as mix - how, etc, will be integrated.
Here is the annotated version of the recipe:
<recipe version="1.1"><line><originaltext>1 (10 ounce) package frozen mixed berries</originaltext><annotation>create_ing(ing18, "1 (10 ounce) package frozen mixed berries")</annotation></line> <line><originaltext>1 (15 ounce) can sliced peaches, drained</originaltext><annotation>create_ing(ing19, "1 (15 ounce) can sliced peaches, drained")</annotation></line> <line><originaltext>2 tablespoons honey</originaltext><annotation>create_ing(ing20, "2 tablespoons honey")</annotation></line> <line><originaltext>In a blender, combine frozen fruit, canned fruit and honey. </originaltext><annotation>create_tool(t4, "blender")</annotation></line> <line><originaltext>In a blender, combine frozen fruit, canned fruit and honey. </originaltext><annotation>combine({ing18, ing19, ing20}, ing21, "fruit and honey", "")</annotation></line> <line><originaltext>In a blender, combine frozen fruit, canned fruit and honey. </originaltext><annotation>put(ing21, t4)</annotation></line> <line><originaltext>Blend until smooth.</originaltext><annotation>mix(ing21, t4, ing22, "smoothie", "blend")</annotation></line> <line><originaltext>Blend until smooth.</originaltext><annotation>chefcheck(ing22,"smooth")</annotation></line> </recipe>
Here are the respective PDDL problem statement and domain statement. Note the problem is generated from the above annotated version.
The problem:
(define (problem problem_a_very_intense_fruit_smoothie) (:domain gourmet) (:objects t4 - tool ing22 ing21 ing20 ing19 ing18 - ingredient) (:init (initialized ing18) (initialized ing19) (initialized ing20)) (:goal (and (mixed_into ing21 t4 ing22) (combined_into_3 ing21 ing18 ing19 ing20) (in ing21 t4) (checked ing22))))
The domain:
(define (domain gourmet) (:requirements :negative-preconditions :conditional-effects :equality :typing :fluents :durative-actions :derived-predicates) (:types tool ingredient - object ) (:predicates (checked ?i - ingredient) (initialized ?i - ingredient) (left_alone ?i - ingredient) (served ?i - ingredient) (in ?i - ingredient ?t - tool) (cooked_into ?i1 - ingredient ?t - tool ?i2 - ingredient) (cut_into ?i1 - ingredient ?t - tool ?i2 - ingredient) (done_into ?i1 - ingredient ?t - tool ?i2 - ingredient) (mixed_into ?i1 - ingredient ?t - tool ?i2 - ingredient) (combined_into_2 ?i ?i0 ?i1 - ingredient) (combined_into_3 ?i ?i0 ?i1 ?i2 - ingredient) (combined_into_4 ?i ?i0 ?i1 ?i2 ?i3 - ingredient) ;; (combined_into_5 ?i ?i0 ?i1 ?i2 ?i3 ?i4 - ingredient) ;; (combined_into_6 ?i ?i0 ?i1 ?i2 ?i3 ?i4 ?i5 - ingredient) ;; (combined_into_7 ?i ?i0 ?i1 ?i2 ?i3 ?i4 ?i5 ?i6 - ingredient) ;; (combined_into_8 ?i ?i0 ?i1 ?i2 ?i3 ?i4 ?i5 ?i6 ?i7 - ingredient) ;; (combined_into_9 ?i ?i0 ?i1 ?i2 ?i3 ?i4 ?i5 ?i6 ?i7 ?i8 - ingredient) ;; (combined_into_10 ?i ?i0 ?i1 ?i2 ?i3 ?i4 ?i5 ?i6 ?i7 ?i8 ?i9 - ingredient) ;; (combined_into_11 ?i ?i0 ?i1 ?i2 ?i3 ?i4 ?i5 ?i6 ?i7 ?i8 ?i9 ?i10 - ingredient) ;; (combined_into_12 ?i ?i0 ?i1 ?i2 ?i3 ?i4 ?i5 ?i6 ?i7 ?i8 ?i9 ?i10 ?i11 - ingredient) ;; (combined_into_13 ?i ?i0 ?i1 ?i2 ?i3 ?i4 ?i5 ?i6 ?i7 ?i8 ?i9 ?i10 ?i11 ?i12 - ingredient) ;; (combined_into_14 ?i ?i0 ?i1 ?i2 ?i3 ?i4 ?i5 ?i6 ?i7 ?i8 ?i9 ?i10 ?i11 ?i12 ?i13 - ingredient) ;; (combined_into_15 ?i ?i0 ?i1 ?i2 ?i3 ?i4 ?i5 ?i6 ?i7 ?i8 ?i9 ?i10 ?i11 ?i12 ?i13 ?i14 - ingredient) ) (:durative-action put :parameters (?i - ingredient ?t - tool) :duration (= ?duration 0.1) :condition (and (at start (initialized ?i)) (at start (not (in ?i ?t))) ) :effect (and (at end (in ?i ?t)) ) ) (:durative-action remove :parameters (?i - ingredient ?t - tool) :duration (= ?duration 0.1) :condition (and (at start (initialized ?i)) (at start (in ?i ?t)) ) :effect (and (at end (not (in ?i ?t))) ) ) (:durative-action check :parameters (?i - ingredient) :duration (= ?duration 0.1) :condition (and (at start (initialized ?i)) (at start (not (checked ?i))) ) :effect (and (at end (checked ?i)) ) ) (:durative-action serve :parameters (?i - ingredient) :duration (= ?duration 0.1) :condition (and (at start (initialized ?i)) (at start (not (served ?i))) ) :effect (and (at end (served ?i)) ) ) (:durative-action leave :parameters (?i - ingredient) :duration (= ?duration 15) :condition (and (at start (initialized ?i)) (at start (not (left_alone ?i))) ) :effect (and (at end (left_alone ?i)) ) ) (:durative-action cook :parameters (?i1 - ingredient ?t - tool ?i2 - ingredient) :duration (= ?duration 0.1) :condition (and (at start (not (cooked_into ?i1 ?t ?i2))) (at start (not (initialized ?i2))) ) :effect (and (at end (cooked_into ?i1 ?t ?i2)) (at end (initialized ?i2)) ) ) (:durative-action mix :parameters (?i1 - ingredient ?t - tool ?i2 - ingredient) :duration (= ?duration 0.1) :condition (and (at start (in ?i1 ?t)) (at start (not (mixed_into ?i1 ?t ?i2))) (at start (initialized ?i1)) (at start (not (initialized ?i2))) ) :effect (and (at end (mixed_into ?i1 ?t ?i2)) (at end (initialized ?i2)) ) ) (:durative-action cut :parameters (?i1 - ingredient ?t - tool ?i2 - ingredient) :duration (= ?duration 0.1) :condition (and (at start (in ?i1 ?t)) (at start (not (cut_into ?i1 ?t ?i2))) (at start (initialized ?i1)) (at start (not (initialized ?i2))) ) :effect (and (at end (cut_into ?i1 ?t ?i2)) (at end (initialized ?i2)) ) ) (:durative-action do :parameters (?i1 - ingredient ?t - tool ?i2 - ingredient) :duration (= ?duration 0.1) :condition (and (at start (in ?i1 ?t)) (at start (not (done_into ?i1 ?t ?i2))) (at start (initialized ?i1)) (at start (not (initialized ?i2))) ) :effect (and (at end (done_into ?i1 ?t ?i2)) (at end (initialized ?i2)) ) ) (:durative-action separate :parameters (?i ?i1 ?i2 - ingredient) :duration (= ?duration 0.1) :condition (and (at start (not (initialized ?i1))) (at start (not (initialized ?i2))) ;; (at start (combined ?i ?i1 ?i2)) ) :effect (and (at end (initialized ?i1)) (at end (initialized ?i2)) (at end (not (combined_into_2 ?i ?i1 ?i2))) ) ) (:durative-action combine_2 :parameters (?i ?i1 ?i2 - ingredient) :duration (= ?duration 0.1) :condition (and (at start (not (initialized ?i))) (at start (not (combined_into_2 ?i ?i1 ?i2))) ) :effect (and (at end (initialized ?i)) (at end (combined_into_2 ?i ?i1 ?i2)) ) ) (:durative-action combine_3 :parameters (?i ?i1 ?i2 ?i3 - ingredient) :duration (= ?duration 0.1) :condition (and (at start (not (initialized ?i))) (at start (not (combined_into_3 ?i ?i1 ?i2 ?i3))) ) :effect (and (at end (initialized ?i)) (at end (combined_into_3 ?i ?i1 ?i2 ?i3)) ) ) (:durative-action combine_4 :parameters (?i ?i1 ?i2 ?i3 ?i4 - ingredient) :duration (= ?duration 0.1) :condition (and (at start (not (initialized ?i))) (at start (not (combined_into_4 ?i ?i1 ?i2 ?i3 ?i4))) ) :effect (and (at end (initialized ?i)) (at end (combined_into_4 ?i ?i1 ?i2 ?i3 ?i4)) ) ) ;; (:durative-action combine_5 ;; :parameters (?i ?i1 ?i2 ?i3 ?i4 ?i5 - ingredient) ;; :duration (= ?duration 0.1) ;; :condition (and ;; (at start (not (initialized ?i))) ;; (at start (not (combined ?i ?i1 ?i2 ?i3 ?i4 ?i5))) ;; ) ;; :effect (and ;; (at end (initialized ?i)) ;; (at end (combined ?i ?i1 ?i2 ?i3 ?i4 ?i5)) ;; ) ;; ) ;; (:durative-action combine_6 ;; :parameters (?i ?i1 ?i2 ?i3 ?i4 ?i5 ?i6 - ingredient) ;; :duration (= ?duration 0.1) ;; :condition (and ;; (at start (not (initialized ?i))) ;; (at start (not (combined ?i ?i1 ?i2 ?i3 ?i4 ?i5 ?i6))) ;; ) ;; :effect (and ;; (at end (initialized ?i)) ;; (at end (combined ?i ?i1 ?i2 ?i3 ?i4 ?i5 ?i6)) ;; ) ;; ) ;; (:durative-action combine_7 ;; :parameters (?i ?i1 ?i2 ?i3 ?i4 ?i5 ?i6 ?i7 - ingredient) ;; :duration (= ?duration 0.1) ;; :condition (and ;; (at start (not (initialized ?i))) ;; (at start (not (combined ?i ?i1 ?i2 ?i3 ?i4 ?i5 ?i6 ?i7))) ;; ) ;; :effect (and ;; (at end (initialized ?i)) ;; (at end (combined ?i ?i1 ?i2 ?i3 ?i4 ?i5 ?i6 ?i7)) ;; ) ;; ) ;; (:durative-action combine_8 ;; :parameters (?i ?i1 ?i2 ?i3 ?i4 ?i5 ?i6 ?i7 ?i8 - ingredient) ;; :duration (= ?duration 0.1) ;; :condition (and ;; (at start (not (initialized ?i))) ;; (at start (not (combined ?i ?i1 ?i2 ?i3 ?i4 ?i5 ?i6 ?i7 ?i8))) ;; ) ;; :effect (and ;; (at end (initialized ?i)) ;; (at end (combined ?i ?i1 ?i2 ?i3 ?i4 ?i5 ?i6 ?i7 ?i8)) ;; ) ;; ) ;; (:durative-action combine_9 ;; :parameters (?i ?i1 ?i2 ?i3 ?i4 ?i5 ?i6 ?i7 ?i8 ?i9 - ingredient) ;; :duration (= ?duration 0.1) ;; :condition (and ;; (at start (not (initialized ?i))) ;; (at start (not (combined ?i ?i1 ?i2 ?i3 ?i4 ?i5 ?i6 ?i7 ?i8 ?i9))) ;; ) ;; :effect (and ;; (at end (initialized ?i)) ;; (at end (combined ?i ?i1 ?i2 ?i3 ?i4 ?i5 ?i6 ?i7 ?i8 ?i9)) ;; ) ;; ) ;; (:durative-action combine_10 ;; :parameters (?i ?i1 ?i2 ?i3 ?i4 ?i5 ?i6 ?i7 ?i8 ?i9 ?i10 - ingredient) ;; :duration (= ?duration 0.1) ;; :condition (and ;; (at start (not (initialized ?i))) ;; (at start (not (combined ?i ?i1 ?i2 ?i3 ?i4 ?i5 ?i6 ?i7 ?i8 ?i9 ?i10))) ;; ) ;; :effect (and ;; (at end (initialized ?i)) ;; (at end (combined ?i ?i1 ?i2 ?i3 ?i4 ?i5 ?i6 ?i7 ?i8 ?i9 ?i10)) ;; ) ;; ) ;; (:durative-action combine_11 ;; :parameters (?i ?i1 ?i2 ?i3 ?i4 ?i5 ?i6 ?i7 ?i8 ?i9 ?i10 ?i11 - ingredient) ;; :duration (= ?duration 0.1) ;; :condition (and ;; (at start (not (initialized ?i))) ;; (at start (not (combined ?i ?i1 ?i2 ?i3 ?i4 ?i5 ?i6 ?i7 ?i8 ?i9 ?i10 ?i11))) ;; ) ;; :effect (and ;; (at end (initialized ?i)) ;; (at end (combined ?i ?i1 ?i2 ?i3 ?i4 ?i5 ?i6 ?i7 ?i8 ?i9 ?i10 ?i11)) ;; ) ;; ) ;; (:durative-action combine_12 ;; :parameters (?i ?i1 ?i2 ?i3 ?i4 ?i5 ?i6 ?i7 ?i8 ?i9 ?i10 ?i11 ?i12 - ingredient) ;; :duration (= ?duration 0.1) ;; :condition (and ;; (at start (not (initialized ?i))) ;; (at start (not (combined ?i ?i1 ?i2 ?i3 ?i4 ?i5 ?i6 ?i7 ?i8 ?i9 ?i10 ?i11 ?i12))) ;; ) ;; :effect (and ;; (at end (initialized ?i)) ;; (at end (combined ?i ?i1 ?i2 ?i3 ?i4 ?i5 ?i6 ?i7 ?i8 ?i9 ?i10 ?i11 ?i12)) ;; ) ;; ) ;; (:durative-action combine_13 ;; :parameters (?i ?i1 ?i2 ?i3 ?i4 ?i5 ?i6 ?i7 ?i8 ?i9 ?i10 ?i11 ?i12 ?i13 - ingredient) ;; :duration (= ?duration 0.1) ;; :condition (and ;; (at start (not (initialized ?i))) ;; (at start (not (combined ?i ?i1 ?i2 ?i3 ?i4 ?i5 ?i6 ?i7 ?i8 ?i9 ?i10 ?i11 ?i12 ?i13))) ;; ) ;; :effect (and ;; (at end (initialized ?i)) ;; (at end (combined ?i ?i1 ?i2 ?i3 ?i4 ?i5 ?i6 ?i7 ?i8 ?i9 ?i10 ?i11 ?i12 ?i13)) ;; ) ;; ) ;; (:durative-action combine_14 ;; :parameters (?i ?i1 ?i2 ?i3 ?i4 ?i5 ?i6 ?i7 ?i8 ?i9 ?i10 ?i11 ?i12 ?i13 ?i14 - ingredient) ;; :duration (= ?duration 0.1) ;; :condition (and ;; (at start (not (initialized ?i))) ;; (at start (not (combined ?i ?i1 ?i2 ?i3 ?i4 ?i5 ?i6 ?i7 ?i8 ?i9 ?i10 ?i11 ?i12 ?i13 ?i14))) ;; ) ;; :effect (and ;; (at end (initialized ?i)) ;; (at end (combined ?i ?i1 ?i2 ?i3 ?i4 ?i5 ?i6 ?i7 ?i8 ?i9 ?i10 ?i11 ?i12 ?i13 ?i14)) ;; ) ;; ) )