CPSC 322 Introduction to Artificial Intelligence November 26, 2004.

Slides:



Advertisements
Similar presentations
Planning Module THREE: Planning, Production Systems,Expert Systems, Uncertainty Dr M M Awais.
Advertisements

CPSC 322 Introduction to Artificial Intelligence November 5, 2004.
Planning Graphs * Based on slides by Alan Fern, Berthe Choueiry and Sungwook Yoon.
TWEAK solving the Sussman anomaly ON(A,B) ON(B,C) ON(C,A) ONTABLE(A) ONTABLE(B) CLEAR(C) CLEAR(B) ARMEMPTY STACK(A,B) STACK(B,C) Two step additions to.
Chapter 4 - Planning 4.1 State Space Planning 4.2 Partial Order Planning 4.3Planning in the Real World Part II: Methods of AI.
Planning Chapter 10.
Artificial Intelligence University Politehnica of Bucharest Adina Magda Florea
Planning Planning is fundamental to “intelligent” behaviour. E.g.
All rights reserved ©L. Manevitz Lecture 61 Artificial Intelligence Planning System L. Manevitz.
Sussman anomaly - analysis The start state is given by: ON(C, A) ONTABLE(A) ONTABLE(B) ARMEMPTY The goal by: ON(A,B) ON(B,C) This immediately leads to.
Planning Russell and Norvig: Chapter 11 Slides adapted from: robotics.stanford.edu/~latombe/cs121/2003/ home.htm.
Artificial Intelligence II S. Russell and P. Norvig Artificial Intelligence: A Modern Approach Chapter 11: Planning.
1 Chapter 4 State-Space Planning. 2 Motivation Nearly all planning procedures are search procedures Different planning procedures have different search.
Planning Some material adapted from slides by Tim Finin,Jean-Claude Latombe, Lise Getoor, and Marie desJardins.
CLASSICAL PLANNING AND GRAPHPLAN Classes 17 and 18 All slides created by Dr. Adam P. Anthony.
1 Classical STRIPS Planning Alan Fern * * Based in part on slides by Daniel Weld.
CPSC 322 Introduction to Artificial Intelligence November 24, 2004.
EXAMPLE OF PARTIAL ORDER PLANNING. Action Recipes: Action: Stack(x,y) Prec: Clear(x) ^ Clear(y) ^ OnTable(x) Effect: ~Clear(y) ^ ~OnTable(x) ^ On(x,y)
CPSC 322 Introduction to Artificial Intelligence November 19, 2004.
Planning Russell and Norvig: Chapter 11. Planning Agent environment agent ? sensors actuators A1A2A3.
OnT-A onT-B onT-C cl-A cl-C cl-B he Pick-A Pick-B Pick-C onT-A onT-B onT-C cl-A cl-C cl-B he h-A h-B h-C ~cl-A ~cl-B ~cl-C ~he st-A-B st-A-C st-B-A st-B-C.
1 Planning Adapted from Tim Finin, UMBC, Marie desJardins Some material adopted from notes by Andreas Geyer-Schulz and Chuck Dyer.
A: A Unified Brand-name-Free Introduction to Planning Subbarao Kambhampati Jan 28 th My lab was hacked and the systems are being rebuilt.. Homepage is.
CSE 574: Planning & Learning Subbarao Kambhampati 1/17: State Space and Plan-space Planning Office hours: 4:30—5:30pm T/Th.
1 Lecture 12 example (from slides prepared by Prof. J. Rosenchein)
Planning Where states are transparent and actions have preconditions and effects Notes at
Intro to AI Fall 2002 © L. Joskowicz 1 Introduction to Artificial Intelligence LECTURE 12: Planning Motivation Search, theorem proving, and planning Situation.
1 Pertemuan 17 Planning Matakuliah: T0264/Intelijensia Semu Tahun: Juli 2006 Versi: 2/1.
Planning Where states are transparent and actions have preconditions and effects Notes at
AI Principles, Lecture on Planning Planning Jeremy Wyatt.
PLANNING Partial order regression planning Temporal representation 1 Deductive planning in Logic Temporal representation 2.
An Introduction to Artificial Intelligence CE Chapter 11 – Planning Ramin Halavati In which we see how an agent can take.
1 07. The planning problem 2  Inputs: 1. A description of the world state 2. The goal state description 3. A set of actions  Output: A sequence of actions.
Dana Nau: Lecture slides for Automated Planning Licensed under the Creative Commons Attribution-NonCommercial-ShareAlike License:
Dana Nau: Lecture slides for Automated Planning Licensed under the Creative Commons Attribution-NonCommercial-ShareAlike License:
Artificial Intelligence: Planning Lecture 6 Problems with state space search Planning Operators A Simple Planning Algorithm (Game Playing)
22/11/04 AIPP Lecture 16: More Planning and Operators1 More Planning Artificial Intelligence Programming in Prolog.
CS.462 Artificial Intelligence SOMCHAI THANGSATHITYANGKUL Lecture 07 : Planning.
1 CMSC 671 Fall 2010 Class #12/13 – Wednesday, October 13/ Monday, October 18 Some material adapted from slides by Jean-Claude Latombe / Lise Getoor.
Planning, page 1 CSI 4106, Winter 2005 Planning Points Elements of a planning problem Planning as resolution Conditional plans Actions as preconditions.
CPS 270: Artificial Intelligence Planning Instructor: Vincent Conitzer.
PLANNING He whose undertakings are all devoid of plan and desire for results, and whose actions are burnt by the fire of knowledge, him the sages call.
Dana Nau: Lecture slides for Automated Planning Licensed under the Creative Commons Attribution-NonCommercial-ShareAlike License:
1 Planning Chapter 10 Some material adopted from notes by Tim Finin, Marie desJardins Andreas Geyer-Schulz, and Chuck Dyer.
1 Chapter 16 Planning Methods. 2 Chapter 16 Contents (1) l STRIPS l STRIPS Implementation l Partial Order Planning l The Principle of Least Commitment.
Introduction to Planning Dr. Shazzad Hosain Department of EECS North South Universtiy
AI Lecture 17 Planning Noémie Elhadad (substituting for Prof. McKeown)
1/16 Planning Chapter 11- Part1 Author: Vali Derhami.
Intro to Planning Or, how to represent the planning problem in logic.
Towards Model-lite Planning A Proposal For Learning & Planning with Incomplete Domain Models Sungwook Yoon Subbarao Kambhampati Supported by DARPA Integrated.
CS621: Artificial Intelligence Pushpak Bhattacharyya Computer Science and Engineering Department IIT Bombay Lecture 19: Hidden Markov Models.
1 Planning Chapter 10 Some material adopted from notes by Tim Finin, Marie desJardins Andreas Geyer-Schulz, and Chuck Dyer.
1 Planning Some material adopted from notes by Andreas Geyer-Schulz and Chuck Dyer.
An Introduction to Artificial Intelligence CE 40417
Planning Chapter 16.
Combined Lecture CS621: Artificial Intelligence (lecture 19) CS626/449: Speech-NLP-Web/Topics-in-AI (lecture 20) Hidden Markov Models Pushpak Bhattacharyya.
Introduction Contents Sungwook Yoon, Postdoctoral Research Associate
CSC 8520 Spring Paula Matuszek
CMSC 471 Fall 2011 Class #16 Tuesday, October 25, 2011 Planning
CS344 : Introduction to Artificial Intelligence
AI Planning.
Planning Chapter and Chuck Dyer
Planning Chapter
CPSC 322 Introduction to Artificial Intelligence
CS344 : Introduction to Artificial Intelligence
Class #15 / 16 – Tuesday, October 20 / Thursday, October 22
Russell and Norvig: Chapter 11 CS121 – Winter 2003
CMSC 471 Fall 2002 Class #20/21/23 – Wednesday, November 6 / Monday, November 11 / Monday, November 18.
L9. STRIPS Examples Recursive STRIPS Block world
Prof. Pushpak Bhattacharyya, IIT Bombay
Presentation transcript:

CPSC 322 Introduction to Artificial Intelligence November 26, 2004

Things... Term project is due Monday

Finding the plan Some of what follows is a repeat from previous lectures, but I added some new material in the middle of what’s repeated. So to make the new stuff more understandable, the slides from last time that surround the new material are presented again.

Finding the plan stack(X,Y) - preconds: clear(Y) & holding(X) delete: clear(Y) & holding(X) add: armempty & on(X,Y) unstack(X,Y) - preconds: on(X,Y) & clear(X) & armempty delete: on(X,Y) & armempty add: holding(X) & clear(Y) pickup(X) - preconds: clear(X) & ontable(X) & armempty delete: ontable(X) & armempty add: holding(X) putdown(X) - preconds: holding(X) delete: holding(X) add: ontable(X) & armempty start: ontable(a) ontable(b) clear(a) clear(b) armempty NOTE: clear = cleartop...I just forgot to type the whole word goals: ontable(b) clear(a) armempty on(a,b) plan:

Finding the plan stack(X,Y) - preconds: clear(Y) & holding(X) delete: clear(Y) & holding(X) add: armempty & on(X,Y) unstack(X,Y) - preconds: on(X,Y) & clear(X) & armempty delete: on(X,Y) & armempty add: holding(X) & clear(Y) pickup(X) - preconds: clear(X) & ontable(X) & armempty delete: ontable(X) & armempty add: holding(X) putdown(X) - preconds: holding(X) delete: holding(X) add: ontable(X) & armempty start: ontable(a) ontable(b) clear(a) clear(b) armempty goals: ontable(b) clear(a) armempty on(a,b) plan: if a goal is fulfilled in the current state, then don’t worry about it

Finding the plan stack(X,Y) - preconds: clear(Y) & holding(X) delete: clear(Y) & holding(X) add: armempty & on(X,Y) unstack(X,Y) - preconds: on(X,Y) & clear(X) & armempty delete: on(X,Y) & armempty add: holding(X) & clear(Y) pickup(X) - preconds: clear(X) & ontable(X) & armempty delete: ontable(X) & armempty add: holding(X) putdown(X) - preconds: holding(X) delete: holding(X) add: ontable(X) & armempty start: ontable(a) ontable(b) clear(a) clear(b) armempty goals: ontable(b) clear(a) armempty on(a,b) plan: if a goal is fulfilled in the current state, then don’t worry about it

Finding the plan stack(X,Y) - preconds: clear(Y) & holding(X) delete: clear(Y) & holding(X) add: armempty & on(X,Y) unstack(X,Y) - preconds: on(X,Y) & clear(X) & armempty delete: on(X,Y) & armempty add: holding(X) & clear(Y) pickup(X) - preconds: clear(X) & ontable(X) & armempty delete: ontable(X) & armempty add: holding(X) putdown(X) - preconds: holding(X) delete: holding(X) add: ontable(X) & armempty start: ontable(a) ontable(b) clear(a) clear(b) armempty goals: on(a,b) plan: if a goal is fulfilled in the current state, then don’t worry about it

Finding the plan stack(X,Y) - preconds: clear(Y) & holding(X) delete: clear(Y) & holding(X) add: armempty & on(X,Y) unstack(X,Y) - preconds: on(X,Y) & clear(X) & armempty delete: on(X,Y) & armempty add: holding(X) & clear(Y) pickup(X) - preconds: clear(X) & ontable(X) & armempty delete: ontable(X) & armempty add: holding(X) putdown(X) - preconds: holding(X) delete: holding(X) add: ontable(X) & armempty start: ontable(a) ontable(b) clear(a) clear(b) armempty goals: on(a,b) plan: for remaining goals, reduce difference between goal and current state

Means-ends analysis Detecting differences between the start state and goal state, then finding an operator to reduce those differences (thereby solving part of the problem) is often called means-ends analysis. Chapter 8 uses it, but doesn’t mention its name.

Means-ends analysis how to reduce this difference? one way might be to find an operator that gets you from some intermediate state to the goal state... startgoal

Means-ends analysis how to reduce this difference? one way might be to find an operator that gets you from some intermediate state to the goal state... startgoalint operator

Means-ends analysis then apply means-ends analysis recursively to reduce the distance between start and intermediate states This is what the STRIPS planner we’re talking about now is doing. But you could also work from the start state toward the goal (forward chaining)... startgoalint operator

Means-ends analysis then apply means-ends analysis recursively to reduce the distance between start and intermediate states This is what the STRIPS planner we’re talking about now is doing. But you could also work from the start state toward the goal (forward chaining)...and then apply means-ends analysis on the distance between the intermediate and goal states startgoalint operator

Means-ends analysis or you could find an operator that gets you from one intermediate state to another, and apply MEA to both of the remaining distances. startgoalint1 operator int2

Finding the plan stack(X,Y) - preconds: clear(Y) & holding(X) delete: clear(Y) & holding(X) add: armempty & on(X,Y) unstack(X,Y) - preconds: on(X,Y) & clear(X) & armempty delete: on(X,Y) & armempty add: holding(X) & clear(Y) pickup(X) - preconds: clear(X) & ontable(X) & armempty delete: ontable(X) & armempty add: holding(X) putdown(X) - preconds: holding(X) delete: holding(X) add: ontable(X) & armempty start: ontable(a) ontable(b) clear(a) clear(b) armempty goals: on(a,b) plan: for remaining goals, reduce difference between goal and current state

Finding the plan stack(X,Y) - preconds: clear(Y) & holding(X) delete: clear(Y) & holding(X) add: armempty & on(X,Y) unstack(X,Y) - preconds: on(X,Y) & clear(X) & armempty delete: on(X,Y) & armempty add: holding(X) & clear(Y) pickup(X) - preconds: clear(X) & ontable(X) & armempty delete: ontable(X) & armempty add: holding(X) putdown(X) - preconds: holding(X) delete: holding(X) add: ontable(X) & armempty start: ontable(a) ontable(b) clear(a) clear(b) armempty goals: on(a,b) plan: find an action with add list that contains goal...

Finding the plan stack(X,Y) - preconds: clear(Y) & holding(X) delete: clear(Y) & holding(X) add: armempty & on(X,Y) unstack(X,Y) - preconds: on(X,Y) & clear(X) & armempty delete: on(X,Y) & armempty add: holding(X) & clear(Y) pickup(X) - preconds: clear(X) & ontable(X) & armempty delete: ontable(X) & armempty add: holding(X) putdown(X) - preconds: holding(X) delete: holding(X) add: ontable(X) & armempty start: ontable(a) ontable(b) clear(a) clear(b) armempty goals: clear(b) holding(a) plan: post that action’s preconditions as new goals...

Finding the plan stack(X,Y) - preconds: clear(Y) & holding(X) delete: clear(Y) & holding(X) add: armempty & on(X,Y) unstack(X,Y) - preconds: on(X,Y) & clear(X) & armempty delete: on(X,Y) & armempty add: holding(X) & clear(Y) pickup(X) - preconds: clear(X) & ontable(X) & armempty delete: ontable(X) & armempty add: holding(X) putdown(X) - preconds: holding(X) delete: holding(X) add: ontable(X) & armempty start: ontable(a) ontable(b) clear(a) clear(b) armempty goals: clear(b) holding(a) plan: stack(a,b) post that action as a step in the plan...

Finding the plan stack(X,Y) - preconds: clear(Y) & holding(X) delete: clear(Y) & holding(X) add: armempty & on(X,Y) unstack(X,Y) - preconds: on(X,Y) & clear(X) & armempty delete: on(X,Y) & armempty add: holding(X) & clear(Y) pickup(X) - preconds: clear(X) & ontable(X) & armempty delete: ontable(X) & armempty add: holding(X) putdown(X) - preconds: holding(X) delete: holding(X) add: ontable(X) & armempty start: ontable(a) ontable(b) clear(a) clear(b) armempty goals: clear(b) holding(a) plan: stack(a,b) if a goal is fulfilled in the current state, then don’t worry about it

Finding the plan stack(X,Y) - preconds: clear(Y) & holding(X) delete: clear(Y) & holding(X) add: armempty & on(X,Y) unstack(X,Y) - preconds: on(X,Y) & clear(X) & armempty delete: on(X,Y) & armempty add: holding(X) & clear(Y) pickup(X) - preconds: clear(X) & ontable(X) & armempty delete: ontable(X) & armempty add: holding(X) putdown(X) - preconds: holding(X) delete: holding(X) add: ontable(X) & armempty start: ontable(a) ontable(b) clear(a) clear(b) armempty goals: clear(b) holding(a) plan: stack(a,b) if a goal is fulfilled in the current state, then don’t worry about it

Finding the plan stack(X,Y) - preconds: clear(Y) & holding(X) delete: clear(Y) & holding(X) add: armempty & on(X,Y) unstack(X,Y) - preconds: on(X,Y) & clear(X) & armempty delete: on(X,Y) & armempty add: holding(X) & clear(Y) pickup(X) - preconds: clear(X) & ontable(X) & armempty delete: ontable(X) & armempty add: holding(X) putdown(X) - preconds: holding(X) delete: holding(X) add: ontable(X) & armempty start: ontable(a) ontable(b) clear(a) clear(b) armempty goals: holding(a) plan: stack(a,b) if a goal is fulfilled in the current state, then don’t worry about it

Finding the plan stack(X,Y) - preconds: clear(Y) & holding(X) delete: clear(Y) & holding(X) add: armempty & on(X,Y) unstack(X,Y) - preconds: on(X,Y) & clear(X) & armempty delete: on(X,Y) & armempty add: holding(X) & clear(Y) pickup(X) - preconds: clear(X) & ontable(X) & armempty delete: ontable(X) & armempty add: holding(X) putdown(X) - preconds: holding(X) delete: holding(X) add: ontable(X) & armempty start: ontable(a) ontable(b) clear(a) clear(b) armempty goals: holding(a) plan: stack(a,b) for remaining goals, reduce difference between goal and current state

Finding the plan stack(X,Y) - preconds: clear(Y) & holding(X) delete: clear(Y) & holding(X) add: armempty & on(X,Y) unstack(X,Y) - preconds: on(X,Y) & clear(X) & armempty delete: on(X,Y) & armempty add: holding(X) & clear(Y) pickup(X) - preconds: clear(X) & ontable(X) & armempty delete: ontable(X) & armempty add: holding(X) putdown(X) - preconds: holding(X) delete: holding(X) add: ontable(X) & armempty start: ontable(a) ontable(b) clear(a) clear(b) armempty goals: holding(a) plan: stack(a,b) find an action with add list that contains goal...

Finding the plan stack(X,Y) - preconds: clear(Y) & holding(X) delete: clear(Y) & holding(X) add: armempty & on(X,Y) unstack(X,Y) - preconds: on(X,Y) & clear(X) & armempty delete: on(X,Y) & armempty add: holding(X) & clear(Y) pickup(X) - preconds: clear(X) & ontable(X) & armempty delete: ontable(X) & armempty add: holding(X) putdown(X) - preconds: holding(X) delete: holding(X) add: ontable(X) & armempty start: ontable(a) ontable(b) clear(a) clear(b) armempty goals: clear(a) ontable(a) armempty plan: stack(a,b) post that action’s preconditions as new goals...

Finding the plan stack(X,Y) - preconds: clear(Y) & holding(X) delete: clear(Y) & holding(X) add: armempty & on(X,Y) unstack(X,Y) - preconds: on(X,Y) & clear(X) & armempty delete: on(X,Y) & armempty add: holding(X) & clear(Y) pickup(X) - preconds: clear(X) & ontable(X) & armempty delete: ontable(X) & armempty add: holding(X) putdown(X) - preconds: holding(X) delete: holding(X) add: ontable(X) & armempty start: ontable(a) ontable(b) clear(a) clear(b) armempty goals: clear(a) ontable(a) armempty plan: pickup(a) stack(a,b) post that action as a step in the plan...

Finding the plan stack(X,Y) - preconds: clear(Y) & holding(X) delete: clear(Y) & holding(X) add: armempty & on(X,Y) unstack(X,Y) - preconds: on(X,Y) & clear(X) & armempty delete: on(X,Y) & armempty add: holding(X) & clear(Y) pickup(X) - preconds: clear(X) & ontable(X) & armempty delete: ontable(X) & armempty add: holding(X) putdown(X) - preconds: holding(X) delete: holding(X) add: ontable(X) & armempty start: ontable(a) ontable(b) clear(a) clear(b) armempty goals: clear(a) ontable(a) armempty plan: pickup(a) stack(a,b) if a goal is fulfilled in the current state, then don’t worry about it

Finding the plan stack(X,Y) - preconds: clear(Y) & holding(X) delete: clear(Y) & holding(X) add: armempty & on(X,Y) unstack(X,Y) - preconds: on(X,Y) & clear(X) & armempty delete: on(X,Y) & armempty add: holding(X) & clear(Y) pickup(X) - preconds: clear(X) & ontable(X) & armempty delete: ontable(X) & armempty add: holding(X) putdown(X) - preconds: holding(X) delete: holding(X) add: ontable(X) & armempty start: ontable(a) ontable(b) clear(a) clear(b) armempty goals: clear(a) ontable(a) armempty plan: pickup(a) stack(a,b) if a goal is fulfilled in the current state, then don’t worry about it

Finding the plan stack(X,Y) - preconds: clear(Y) & holding(X) delete: clear(Y) & holding(X) add: armempty & on(X,Y) unstack(X,Y) - preconds: on(X,Y) & clear(X) & armempty delete: on(X,Y) & armempty add: holding(X) & clear(Y) pickup(X) - preconds: clear(X) & ontable(X) & armempty delete: ontable(X) & armempty add: holding(X) putdown(X) - preconds: holding(X) delete: holding(X) add: ontable(X) & armempty start: ontable(a) ontable(b) clear(a) clear(b) armempty goals: plan: pickup(a) stack(a,b) all the goals have been fulfilled...we now have our plan

Executing the plan stack(X,Y) - preconds: clear(Y) & holding(X) delete: clear(Y) & holding(X) add: armempty & on(X,Y) unstack(X,Y) - preconds: on(X,Y) & clear(X) & armempty delete: on(X,Y) & armempty add: holding(X) & clear(Y) pickup(X) - preconds: clear(X) & ontable(X) & armempty delete: ontable(X) & armempty add: holding(X) putdown(X) - preconds: holding(X) delete: holding(X) add: ontable(X) & armempty start: ontable(a) ontable(b) clear(a) clear(b) armempty goals: plan: pickup(a) stack(a,b) are the preconditions for the first step true? yes

Executing the plan stack(X,Y) - preconds: clear(Y) & holding(X) delete: clear(Y) & holding(X) add: armempty & on(X,Y) unstack(X,Y) - preconds: on(X,Y) & clear(X) & armempty delete: on(X,Y) & armempty add: holding(X) & clear(Y) pickup(X) - preconds: clear(X) & ontable(X) & armempty delete: ontable(X) & armempty add: holding(X) putdown(X) - preconds: holding(X) delete: holding(X) add: ontable(X) & armempty start: ontable(a) ontable(b) clear(a) clear(b) armempty goals: plan: pickup(a) stack(a,b) then do what the delete list says to do...

Executing the plan stack(X,Y) - preconds: clear(Y) & holding(X) delete: clear(Y) & holding(X) add: armempty & on(X,Y) unstack(X,Y) - preconds: on(X,Y) & clear(X) & armempty delete: on(X,Y) & armempty add: holding(X) & clear(Y) pickup(X) - preconds: clear(X) & ontable(X) & armempty delete: ontable(X) & armempty add: holding(X) putdown(X) - preconds: holding(X) delete: holding(X) add: ontable(X) & armempty start: ontable(b) clear(a) clear(b) armempty goals: plan: pickup(a) stack(a,b) then do what the delete list says to do...

Executing the plan stack(X,Y) - preconds: clear(Y) & holding(X) delete: clear(Y) & holding(X) add: armempty & on(X,Y) unstack(X,Y) - preconds: on(X,Y) & clear(X) & armempty delete: on(X,Y) & armempty add: holding(X) & clear(Y) pickup(X) - preconds: clear(X) & ontable(X) & armempty delete: ontable(X) & armempty add: holding(X) putdown(X) - preconds: holding(X) delete: holding(X) add: ontable(X) & armempty start: ontable(b) clear(a) clear(b) goals: plan: pickup(a) stack(a,b) then do what the delete list says to do...

Executing the plan stack(X,Y) - preconds: clear(Y) & holding(X) delete: clear(Y) & holding(X) add: armempty & on(X,Y) unstack(X,Y) - preconds: on(X,Y) & clear(X) & armempty delete: on(X,Y) & armempty add: holding(X) & clear(Y) pickup(X) - preconds: clear(X) & ontable(X) & armempty delete: ontable(X) & armempty add: holding(X) putdown(X) - preconds: holding(X) delete: holding(X) add: ontable(X) & armempty start: ontable(b) clear(a) clear(b) goals: plan: pickup(a) stack(a,b) and then do what the add list says to do...

Executing the plan stack(X,Y) - preconds: clear(Y) & holding(X) delete: clear(Y) & holding(X) add: armempty & on(X,Y) unstack(X,Y) - preconds: on(X,Y) & clear(X) & armempty delete: on(X,Y) & armempty add: holding(X) & clear(Y) pickup(X) - preconds: clear(X) & ontable(X) & armempty delete: ontable(X) & armempty add: holding(X) putdown(X) - preconds: holding(X) delete: holding(X) add: ontable(X) & armempty start: holding(a) ontable(b) clear(a) clear(b) goals: plan: pickup(a) stack(a,b) and then do what the add list says to do...

Executing the plan stack(X,Y) - preconds: clear(Y) & holding(X) delete: clear(Y) & holding(X) add: armempty & on(X,Y) unstack(X,Y) - preconds: on(X,Y) & clear(X) & armempty delete: on(X,Y) & armempty add: holding(X) & clear(Y) pickup(X) - preconds: clear(X) & ontable(X) & armempty delete: ontable(X) & armempty add: holding(X) putdown(X) - preconds: holding(X) delete: holding(X) add: ontable(X) & armempty start: holding(a) ontable(b) clear(a) clear(b) goals: plan: pickup(a) stack(a,b) are the preconditions for the second step true? yes

Executing the plan stack(X,Y) - preconds: clear(Y) & holding(X) delete: clear(Y) & holding(X) add: armempty & on(X,Y) unstack(X,Y) - preconds: on(X,Y) & clear(X) & armempty delete: on(X,Y) & armempty add: holding(X) & clear(Y) pickup(X) - preconds: clear(X) & ontable(X) & armempty delete: ontable(X) & armempty add: holding(X) putdown(X) - preconds: holding(X) delete: holding(X) add: ontable(X) & armempty start: holding(a) ontable(b) clear(a) clear(b) goals: plan: pickup(a) stack(a,b) then do what the delete list says to do...

Executing the plan stack(X,Y) - preconds: clear(Y) & holding(X) delete: clear(Y) & holding(X) add: armempty & on(X,Y) unstack(X,Y) - preconds: on(X,Y) & clear(X) & armempty delete: on(X,Y) & armempty add: holding(X) & clear(Y) pickup(X) - preconds: clear(X) & ontable(X) & armempty delete: ontable(X) & armempty add: holding(X) putdown(X) - preconds: holding(X) delete: holding(X) add: ontable(X) & armempty start: holding(a) ontable(b) clear(a) goals: plan: pickup(a) stack(a,b) then do what the delete list says to do...

Executing the plan stack(X,Y) - preconds: clear(Y) & holding(X) delete: clear(Y) & holding(X) add: armempty & on(X,Y) unstack(X,Y) - preconds: on(X,Y) & clear(X) & armempty delete: on(X,Y) & armempty add: holding(X) & clear(Y) pickup(X) - preconds: clear(X) & ontable(X) & armempty delete: ontable(X) & armempty add: holding(X) putdown(X) - preconds: holding(X) delete: holding(X) add: ontable(X) & armempty start: ontable(b) clear(a) goals: plan: pickup(a) stack(a,b) then do what the delete list says to do...

Executing the plan stack(X,Y) - preconds: clear(Y) & holding(X) delete: clear(Y) & holding(X) add: armempty & on(X,Y) unstack(X,Y) - preconds: on(X,Y) & clear(X) & armempty delete: on(X,Y) & armempty add: holding(X) & clear(Y) pickup(X) - preconds: clear(X) & ontable(X) & armempty delete: ontable(X) & armempty add: holding(X) putdown(X) - preconds: holding(X) delete: holding(X) add: ontable(X) & armempty start: ontable(b) clear(a) goals: plan: pickup(a) stack(a,b) and then do what the add list says to do...

Executing the plan stack(X,Y) - preconds: clear(Y) & holding(X) delete: clear(Y) & holding(X) add: armempty & on(X,Y) unstack(X,Y) - preconds: on(X,Y) & clear(X) & armempty delete: on(X,Y) & armempty add: holding(X) & clear(Y) pickup(X) - preconds: clear(X) & ontable(X) & armempty delete: ontable(X) & armempty add: holding(X) putdown(X) - preconds: holding(X) delete: holding(X) add: ontable(X) & armempty start: armempty ontable(b) clear(a) goals: plan: pickup(a) stack(a,b) and then do what the add list says to do...

Executing the plan stack(X,Y) - preconds: clear(Y) & holding(X) delete: clear(Y) & holding(X) add: armempty & on(X,Y) unstack(X,Y) - preconds: on(X,Y) & clear(X) & armempty delete: on(X,Y) & armempty add: holding(X) & clear(Y) pickup(X) - preconds: clear(X) & ontable(X) & armempty delete: ontable(X) & armempty add: holding(X) putdown(X) - preconds: holding(X) delete: holding(X) add: ontable(X) & armempty start: armempty ontable(b) clear(a) on(a,b) goals: plan: pickup(a) stack(a,b) and then do what the add list says to do...

Executing the plan stack(X,Y) - preconds: clear(Y) & holding(X) delete: clear(Y) & holding(X) add: armempty & on(X,Y) unstack(X,Y) - preconds: on(X,Y) & clear(X) & armempty delete: on(X,Y) & armempty add: holding(X) & clear(Y) pickup(X) - preconds: clear(X) & ontable(X) & armempty delete: ontable(X) & armempty add: holding(X) putdown(X) - preconds: holding(X) delete: holding(X) add: ontable(X) & armempty start: armempty ontable(b) clear(a) on(a,b) goals: plan: pickup(a) stack(a,b) the plan is finished...how does the resulting state compare to original goal?

Executing the plan stack(X,Y) - preconds: clear(Y) & holding(X) delete: clear(Y) & holding(X) add: armempty & on(X,Y) unstack(X,Y) - preconds: on(X,Y) & clear(X) & armempty delete: on(X,Y) & armempty add: holding(X) & clear(Y) pickup(X) - preconds: clear(X) & ontable(X) & armempty delete: ontable(X) & armempty add: holding(X) putdown(X) - preconds: holding(X) delete: holding(X) add: ontable(X) & armempty start: armempty ontable(b) clear(a) on(a,b) goals: ontable(b) clear(a) armempty on(a,b) plan: pickup(a) stack(a,b) the plan is finished...how does the resulting state compare to original goal?

Executing the plan stack(X,Y) - preconds: clear(Y) & holding(X) delete: clear(Y) & holding(X) add: armempty & on(X,Y) unstack(X,Y) - preconds: on(X,Y) & clear(X) & armempty delete: on(X,Y) & armempty add: holding(X) & clear(Y) pickup(X) - preconds: clear(X) & ontable(X) & armempty delete: ontable(X) & armempty add: holding(X) putdown(X) - preconds: holding(X) delete: holding(X) add: ontable(X) & armempty start: armempty ontable(b) clear(a) on(a,b) goals: ontable(b) clear(a) armempty on(a,b) plan: pickup(a) stack(a,b) give your robot a cookie

How about some tasty CILOG code? /* This is an implementation of the simple STRIPS planner shown on page 302 of the Computational Intelligence text. launch it with the query: cilog: ask goals(G) & achieve_all(G,init,Plan). Note that the add list is denoted here by "achieves" instead of "add", and that the add and delete lists aren't exactly lists. */ /* stack action */ preconditions(stack(X,Y),[cleartop(Y),holding(X)]). achieves(stack(X,Y),armempty). achieves(stack(X,Y),on(X,Y)). deletes(stack(X,Y),cleartop(Y)). deletes(stack(X,Y),holding(X)).

How about some tasty CILOG code? /* unstack action */ preconditions(unstack(X,Y),[on(X,Y),clear(X),armempty]). achieves(unstack(X,Y),holding(X)). achieves(unstack(X,Y),cleartop(Y)). deletes(unstack(X,Y),on(X,Y)). deletes(unstack(X,Y),armempty). /* pickup action */ preconditions(pickup(X),[cleartop(X),ontable(X),armempty]). achieves(pickup(X),holding(X)). deletes(pickup(X),ontable(X)). deletes(pickup(X),armempty). /* putdown action */ preconditions(putdown(X),[holding(X)]). achieves(putdown(X),ontable(X)). achieves(putdown(X),armempty). deletes(putdown(X),holding(X)).

How about some tasty CILOG code? /* initial situation */ holds(ontable(a),init). holds(ontable(b),init). holds(cleartop(a),init). holds(cleartop(b),init). holds(armempty,init). achieves(init,X) <- holds(X,init). goals([ontable(b),cleartop(a),armempty,on(a,b)]).

How about some tasty CILOG code? /* the simple STRIPS planner */ remove(X,[X|Y],Y). achieve_all([],W0,W0). achieve_all(Goals,W0,W2) <- remove(G,Goals,Rem_Gs) & achieve(G,W0,W1) & achieve_all(Rem_Gs,W1,W2). achieve(G,W,W) <- holds(G,W). achieve(G,W0,do(Action,W1)) <- achieves(Action,G) & preconditions(Action,Pre) & achieve_all(Pre,W0,W1).

How about some tasty CILOG code? /* the simple STRIPS planner */ remove(X,[X|Y],Y). achieve_all([],W0,W0). achieve_all(Goals,W0,W2) <- remove(G,Goals,Rem_Gs) & % choose first goal on list achieve(G,W0,W1) & % try to achieve that goal G achieve_all(Rem_Gs,W1,W2). % then deal with other goals achieve(G,W,W) <- holds(G,W). achieve(G,W0,do(Action,W1)) <- achieves(Action,G) & preconditions(Action,Pre) & achieve_all(Pre,W0,W1).

How about some tasty CILOG code? /* the simple STRIPS planner */ remove(X,[X|Y],Y). achieve_all([],W0,W0). achieve_all(Goals,W0,W2) <- remove(G,Goals,Rem_Gs) & % choose first goal on list achieve(G,W0,W1) & % try to achieve that goal G achieve_all(Rem_Gs,W1,W2). % then deal with other goals achieve(G,W,W) <- holds(G,W). % goal G is achieved if it % holds for state W achieve(G,W0,do(Action,W1)) <- achieves(Action,G) & preconditions(Action,Pre) & achieve_all(Pre,W0,W1).

How about some tasty CILOG code? /* the simple STRIPS planner */ remove(X,[X|Y],Y). achieve_all([],W0,W0). achieve_all(Goals,W0,W2) <- remove(G,Goals,Rem_Gs) & % choose first goal on list achieve(G,W0,W1) & % try to achieve that goal G achieve_all(Rem_Gs,W1,W2). % then deal with other goals achieve(G,W,W) <- holds(G,W). % goal G is achieved if it % holds for state W achieve(G,W0,do(Action,W1)) <- achieves(Action,G) & % G on add list for Action preconditions(Action,Pre) & % get preconds for Action achieve_all(Pre,W0,W1). % preconds are now goals

Desirable attributes of a knowledge representation approach capture generalities in the world being modeled easily modifiable to reflect changes so that new knowledge can be derived from old knowledge transparent - understandable by people who provide the knowledge as well as those who look at it later usable even if not entirely accurate or complete explicitly represent important objects and relationships natural constraints on how one object or relation influences another should be obvious irrelevant detail should be suppressed (abstracted away) complete -- everything that needs to be represented can be represented concise -- what needs to be said can be said efficiently fast -- you can store and retrieve information quickly computable -- enables reasoning to proceed easily with known procedures (doesn’t rely on bizarre coding tricks)

Did choosing a good KR approach make this problem easier? /* the simple STRIPS planner */ remove(X,[X|Y],Y). achieve_all([],W0,W0). achieve_all(Goals,W0,W2) <- remove(G,Goals,Rem_Gs) & achieve(G,W0,W1) & achieve_all(Rem_Gs,W1,W2). achieve(G,W,W) <- holds(G,W). achieve(G,W0,do(Action,W1)) <- achieves(Action,G) & preconditions(Action,Pre) & achieve_all(Pre,W0,W1).

A new start state B A ontable(a) ontable(b) ontable(c) cleartop(a) cleartop(b) cleartop(c) armempty C

A new goal state B A on(a,b) on(b,c) C

Will our simple planner work? Load ‘strips01.ci’ and add the extra block Try it on both of these: ask achieve_all([on(b,c),on(a,b)],init,P). ask achieve_all([on(a,b),on(b,c)],init,P).

Why it doesn’t work /* the simple STRIPS planner */ remove(X,[X|Y],Y). achieve_all([],W0,W0). achieve_all(Goals,W0,W2) <- remove(G,Goals,Rem_Gs) & % choose first goal on list achieve(G,W0,W1) & % try to achieve that goal G achieve_all(Rem_Gs,W1,W2). % then deal with other goals achieve(G,W,W) <- holds(G,W). % goal G is achieved if it % holds for state W achieve(G,W0,do(Action,W1)) <- achieves(Action,G) & % G on add list for Action preconditions(Action,Pre) & % get preconds for Action achieve_all(Pre,W0,W1). % preconds are now goals You gotta check intermediate states, not just the initial state

Will a more complex planner work? Load ‘strips02.ci’ -- the extra block is already there Then try it on both of these: ask achieve_all([on(b,c),on(a,b)],init,P). ask achieve_all([on(a,b),on(b,c)],init,P).

Here’s a better planner achieve_all([],W0,W0). achieve_all(Goals,W0,W2) <- remove(G,Goals,Rem_Gs) & achieve(G,W0,W1) & achieve_all(Rem_Gs,W1,W2). achieve(G,W,W) <- true_in(G,W). achieve(A \= B,W,W) <- A \= B. achieve(G,W0,do(Action,W1)) <- achieves(Action,G) & preconditions(Action,Pre) & achieve_all(Pre,W0,W1). true_in(G,init) <- holds(G,init). true_in(G,do(A,_)) <- achieves(A,G). true_in(G,do(A,S)) <- true_in(G,S) & ~ deletes(A,G).

Here’s a better planner achieve_all([],W0,W0). achieve_all(Goals,W0,W2) <- remove(G,Goals,Rem_Gs) & achieve(G,W0,W1) & achieve_all(Rem_Gs,W1,W2). achieve(G,W,W) <- true_in(G,W). achieve(A \= B,W,W) <- A \= B. % so we don’t stack a block % on itself achieve(G,W0,do(Action,W1)) <- achieves(Action,G) & preconditions(Action,Pre) & achieve_all(Pre,W0,W1). true_in(G,init) <- holds(G,init). true_in(G,do(A,_)) <- achieves(A,G). true_in(G,do(A,S)) <- true_in(G,S) & ~ deletes(A,G).

Here’s a better planner /* stack action */ preconditions(stack(X,Y),[cleartop(Y),X\=Y,holding(X)]). achieves(stack(X,Y),armempty). achieves(stack(X,Y),on(X,Y)). deletes(stack(X,Y),cleartop(Y)). deletes(stack(X,Y),holding(X)). /* unstack action */ preconditions(unstack(X,Y),[on(X,Y),cleartop(X),X\=Y],armempty). achieves(unstack(X,Y),holding(X)). achieves(unstack(X,Y),cleartop(Y)). deletes(unstack(X,Y),on(X,Y)). deletes(unstack(X,Y),armempty).

Here’s a better planner achieve_all([],W0,W0). achieve_all(Goals,W0,W2) <- remove(G,Goals,Rem_Gs) & achieve(G,W0,W1) & achieve_all(Rem_Gs,W1,W2). achieve(G,W,W) <- true_in(G,W). % check more than init state achieve(A \= B,W,W) <- A \= B. % so we don’t stack a block % on itself achieve(G,W0,do(Action,W1)) <- achieves(Action,G) & preconditions(Action,Pre) & achieve_all(Pre,W0,W1). true_in(G,init) <- holds(G,init). true_in(G,do(A,_)) <- achieves(A,G). true_in(G,do(A,S)) <- true_in(G,S) & ~ deletes(A,G).

Here’s a better planner achieve_all([],W0,W0). achieve_all(Goals,W0,W2) <- remove(G,Goals,Rem_Gs) & achieve(G,W0,W1) & achieve_all(Rem_Gs,W1,W2). achieve(G,W,W) <- true_in(G,W). % check more than init state achieve(A \= B,W,W) <- A \= B. % so we don’t stack a block % on itself achieve(G,W0,do(Action,W1)) <- achieves(Action,G) & preconditions(Action,Pre) & achieve_all(Pre,W0,W1). true_in(G,init) <- % G achieved if it holds in holds(G,init). % initial state true_in(G,do(A,_)) <- achieves(A,G). true_in(G,do(A,S)) <- true_in(G,S) & ~ deletes(A,G).

Here’s a better planner achieve_all([],W0,W0). achieve_all(Goals,W0,W2) <- remove(G,Goals,Rem_Gs) & achieve(G,W0,W1) & achieve_all(Rem_Gs,W1,W2). achieve(G,W,W) <- true_in(G,W). % check more than init state achieve(A \= B,W,W) <- A \= B. % so we don’t stack a block % on itself achieve(G,W0,do(Action,W1)) <- achieves(Action,G) & preconditions(Action,Pre) & achieve_all(Pre,W0,W1). true_in(G,init) <- % G achieved if it holds in holds(G,init). % initial state true_in(G,do(A,_)) <- % or if it’s on the add list achieves(A,G). % of the action that’s the true_in(G,do(A,S)) <- % most recent plan step true_in(G,S) & ~ deletes(A,G).

Here’s a better planner achieve_all([],W0,W0). achieve_all(Goals,W0,W2) <- remove(G,Goals,Rem_Gs) & achieve(G,W0,W1) & achieve_all(Rem_Gs,W1,W2). achieve(G,W,W) <- true_in(G,W). % check more than init state achieve(A \= B,W,W) <- A \= B. % so we don’t stack a block % on itself achieve(G,W0,do(Action,W1)) <- achieves(Action,G) & preconditions(Action,Pre) & achieve_all(Pre,W0,W1). true_in(G,init) <- % G achieved if it holds in holds(G,init). % initial state true_in(G,do(A,_)) <- % or if it’s on the add list achieves(A,G). % of the action that’s the true_in(G,do(A,S)) <- % most recent plan step true_in(G,S) & % or if it’s achieved in an ~ deletes(A,G). % earlier plan step and not % on delete list of A

Why doesn’t it work always? goals: on(b,c) on(a,b) B A C

Why doesn’t it work always? goals: on(b,c) on(a,b) B A C

Why doesn’t it work always? goals: on(b,c) on(a,b) B A C

Why doesn’t it work always? goals: on(a,b) B A C

Why doesn’t it work always? goals: on(a,b) B A C

Why doesn’t it work always? goals: this works B A C

Why doesn’t it work always? goals: on(a,b) on(b,c) B A C

Why doesn’t it work always? goals: on(a,b) on(b,c) B A C

Why doesn’t it work always? goals: on(b,c) Now what? B A C

Why doesn’t it work always? goals: on(b,c) Pick it up again... B A C

Why doesn’t it work always? goals: on(b,c)...and put it where? B A C

Why doesn’t it work always? goals: on(b,c) B A C here?

Why doesn’t it work always? Because satisfying one goal sometimes interferes with another. So we employ heuristics to resolve the conflicts.

An example We have two goals: goals: on(a,b) on(b,c)

An example means-ends analysis says choose two operators whose results are on(a,b) and on(b,c) goals: on(a,b) on(b,c)

An example those would be stack(a,b) and stack(b,c), with their associated preconditions/postconditions pre: clear(b) clear(c) holding(a) holding(b) op: stack(a,b) stack(b,c) post: armempty armempty on(a,b) on(b,c) ~clear(b) ~clear(c) ~holding(a) ~holding(b) goals: on(a,b) on(b,c)

An example but two of the preconditions remain unsatisfied: holding(a) and holding(b)... pre: clear(b) clear(c) holding(a) holding(b) op: stack(a,b) stack(b,c) post: armempty armempty on(a,b) on(b,c) ~clear(b) ~clear(c) ~holding(a) ~holding(b) goals: on(a,b) on(b,c)

An example...so means-ends analysis says choose operators whose results are holding(a) and holding(b)... pre: clear(b) clear(c) holding(a) holding(b) op: stack(a,b) stack(b,c) post: armempty armempty on(a,b) on(b,c) ~clear(b) ~clear(c) ~holding(a) ~holding(b) goals: on(a,b) on(b,c)

An example...and those would be pickup(a) and pickup(b) pre: clear(a) clear(b) ontable(a) ontable(b) armempty armempty op: pickup(a) pickup(b) post: ~ontable(a) ~ontable(b) ~armempty ~armempty holding(a) holding(b) pre: clear(b) clear(c) holding(a) holding(b) op: stack(a,b) stack(b,c) post: armempty armempty on(a,b) on(b,c) ~clear(b) ~clear(c) ~holding(a) ~holding(b) goals: on(a,b) on(b,c)

An example we could now execute either of these plans but the one on the left prevents success of the one on the right pre: clear(a) clear(b) ontable(a) ontable(b) armempty armempty op: pickup(a) pickup(b) post: ~ontable(a) ~ontable(b) ~armempty ~armempty holding(a) holding(b) pre: clear(b) clear(c) holding(a) holding(b) op: stack(a,b) stack(b,c) post: armempty armempty on(a,b) on(b,c) ~clear(b) ~clear(c) ~holding(a) ~holding(b) goals: on(a,b) on(b,c)

An example but we at least know that pickup(a) comes before stack(a,b) and pickup(b) comes before stack(b,c) pre: clear(a) clear(b) pickup(a) ontable(a) ontable(b) armempty armempty stack(a,b) op: pickup(a) pickup(b) post: ~ontable(a) ~ontable(b) pickup(b) ~armempty ~armempty holding(a) holding(b) stack(b,c) pre: clear(b) clear(c) holding(a) holding(b) op: stack(a,b) stack(b,c) post: armempty armempty on(a,b) on(b,c) ~clear(b) ~clear(c) ~holding(a) ~holding(b) goals: on(a,b) on(b,c)

An example we see that ~clear(b) on the left would prevent clear(b) on the right... pre: clear(a) clear(b) pickup(a) ontable(a) ontable(b) armempty armempty stack(a,b) op: pickup(a) pickup(b) post: ~ontable(a) ~ontable(b) pickup(b) ~armempty ~armempty holding(a) holding(b) stack(b,c) pre: clear(b) clear(c) holding(a) holding(b) op: stack(a,b) stack(b,c) post: armempty armempty on(a,b) on(b,c) ~clear(b) ~clear(c) ~holding(a) ~holding(b) goals: on(a,b) on(b,c)

An example so stack(a,b) can’t come before pickup(b) pre: clear(a) clear(b) pickup(a) ontable(a) ontable(b) armempty armempty stack(a,b) op: pickup(a) pickup(b) post: ~ontable(a) ~ontable(b) pickup(b) ~armempty ~armempty holding(a) holding(b) stack(b,c) pre: clear(b) clear(c) holding(a) holding(b) op: stack(a,b) stack(b,c) post: armempty armempty on(a,b) on(b,c) ~clear(b) ~clear(c) ~holding(a) ~holding(b) goals: on(a,b) on(b,c)

An example so stack(a,b) can’t come before pickup(b) pre: clear(a) clear(b) pickup(a) ontable(a) ontable(b) armempty armempty pickup(b) op: pickup(a) pickup(b) post: ~ontable(a) ~ontable(b) stack(a,b) ~armempty ~armempty holding(a) holding(b) stack(b,c) pre: clear(b) clear(c) holding(a) holding(b) op: stack(a,b) stack(b,c) post: armempty armempty on(a,b) on(b,c) ~clear(b) ~clear(c) ~holding(a) ~holding(b) goals: on(a,b) on(b,c)

An example and you can’t pickup(b) then stack(a,b) pre: clear(a) clear(b) pickup(a) ontable(a) ontable(b) armempty armempty pickup(b) op: pickup(a) pickup(b) post: ~ontable(a) ~ontable(b) stack(a,b) ~armempty ~armempty holding(a) holding(b) stack(b,c) pre: clear(b) clear(c) holding(a) holding(b) op: stack(a,b) stack(b,c) post: armempty armempty on(a,b) on(b,c) ~clear(b) ~clear(c) ~holding(a) ~holding(b) goals: on(a,b) on(b,c)

An example so you can promote pickup(b) again pre: clear(a) clear(b) pickup(b) ontable(a) ontable(b) armempty armempty pickup(a) op: pickup(a) pickup(b) post: ~ontable(a) ~ontable(b) stack(a,b) ~armempty ~armempty holding(a) holding(b) stack(b,c) pre: clear(b) clear(c) holding(a) holding(b) op: stack(a,b) stack(b,c) post: armempty armempty on(a,b) on(b,c) ~clear(b) ~clear(c) ~holding(a) ~holding(b) goals: on(a,b) on(b,c)

An example pickup(b) can’t come right before pickup(a) pre: clear(a) clear(b) pickup(b) ontable(a) ontable(b) armempty armempty pickup(a) op: pickup(a) pickup(b) post: ~ontable(a) ~ontable(b) stack(a,b) ~armempty ~armempty holding(a) holding(b) stack(b,c) pre: clear(b) clear(c) holding(a) holding(b) op: stack(a,b) stack(b,c) post: armempty armempty on(a,b) on(b,c) ~clear(b) ~clear(c) ~holding(a) ~holding(b) goals: on(a,b) on(b,c)

An example so some other action has to immediately follow pickup(b), and it can’t be stack(a,b) because it must follow pickup(a) pre: clear(a) clear(b) pickup(b) ontable(a) ontable(b) armempty armempty pickup(a) op: pickup(a) pickup(b) post: ~ontable(a) ~ontable(b) stack(a,b) ~armempty ~armempty holding(a) holding(b) stack(b,c) pre: clear(b) clear(c) holding(a) holding(b) op: stack(a,b) stack(b,c) post: armempty armempty on(a,b) on(b,c) ~clear(b) ~clear(c) ~holding(a) ~holding(b) goals: on(a,b) on(b,c)

An example the only action left is stack(b,c), so it’s promoted up in front of pickup(a)...it can’t go any higher pre: clear(a) clear(b) pickup(b) ontable(a) ontable(b) armempty armempty pickup(a) op: pickup(a) pickup(b) post: ~ontable(a) ~ontable(b) stack(a,b) ~armempty ~armempty holding(a) holding(b) stack(b,c) pre: clear(b) clear(c) holding(a) holding(b) op: stack(a,b) stack(b,c) post: armempty armempty on(a,b) on(b,c) ~clear(b) ~clear(c) ~holding(a) ~holding(b) goals: on(a,b) on(b,c)

An example the only action left is stack(b,c), so it’s promoted up in front of pickup(a)...it can’t go any higher pre: clear(a) clear(b) pickup(b) ontable(a) ontable(b) armempty armempty stack(b,c) op: pickup(a) pickup(b) post: ~ontable(a) ~ontable(b) pickup(a) ~armempty ~armempty holding(a) holding(b) stack(a,b) pre: clear(b) clear(c) holding(a) holding(b) op: stack(a,b) stack(b,c) post: armempty armempty on(a,b) on(b,c) ~clear(b) ~clear(c) ~holding(a) ~holding(b) goals: on(a,b) on(b,c)

An example no more conflicts...that’s our plan pre: clear(a) clear(b) pickup(b) ontable(a) ontable(b) armempty armempty stack(b,c) op: pickup(a) pickup(b) post: ~ontable(a) ~ontable(b) pickup(a) ~armempty ~armempty holding(a) holding(b) stack(a,b) pre: clear(b) clear(c) holding(a) holding(b) op: stack(a,b) stack(b,c) post: armempty armempty on(a,b) on(b,c) ~clear(b) ~clear(c) ~holding(a) ~holding(b) goals: on(a,b) on(b,c)