ADL
Action Description Language (ADL) is a richer language than STRIPS.
It allows for
• Positive and negative literals in states
• The open world assumption
• Quantified variables in goals as well as conjunctions and disjunctions
• Conditional effects
• (in)Equality predicates
• Types associated with variables
-
状态中的正负文字:
- ADL 允许状态中包含正文字和负文字,这使得状态的描述更加灵活和精确。
- 负文字表示某种条件不成立。
-
开放世界假设:
- ADL 支持开放世界假设,这意味着状态中未提及的条件默认为假。
- 这与 STRIPS 中的封闭世界假设不同,后者假设未提及的条件默认为真。
-
目标中的量化变量:
- ADL 允许在目标中使用量化变量,这使得可以定义更复杂的规划目标。
- 量化变量可以出现在合取(conjunctions)和析取(disjunctions)中。
-
条件效果:
- ADL 允许动作具有条件效果,这意味着动作的效果取决于执行动作时的状态。
- 条件效果比 STRIPS 的简单效果更加灵活。
-
(不)等式谓词:
- ADL 支持 (不) 等式谓词,这使得可以表达更复杂的关系和条件。
- 等式谓词可以用来比较变量的值。
-
变量类型:
- ADL 允许为变量指定类型,这有助于避免类型错误和提高规划的准确性。
PDDL
• Planning Domain Definition Language (PDDL)
is a standard encoding language for “classical“ planning tasks
• Components of a PDDL planning task:
— Objects: Things in the world that interest us.
— Predicates: Properties of objects that we are interested in; can be true or false.
— Initial state: The state of the world that we start in.
— Goal specification: Things that we want to be true.
— Actions/Operators: Ways of changing the state of the world.
-
对象(Objects):
- 对象是我们在世界中感兴趣的事物。
- 对象可以是具体的实体,如人、物体、地点等。
-
谓词(Predicates):
- 谓词是对象属性的描述,可以是真或假。
- 谓词定义了对象之间的关系和状态。
-
初始状态(Initial state):
- 初始状态是我们开始时的世界状态。
- 它描述了所有对象和谓词的初始值。
-
目标规格(Goal specification):
- 目标规格是我们希望为真的事物。
- 它定义了规划任务的成功条件。
-
动作/运算符(Actions/Operators):
- 动作/运算符是改变世界状态的方式。
- 它们定义了智能体可以执行的操作,以及这些操作如何改变对象和谓词的状态。
PDDL 示例
-
对象:
- “Person, House, Room”
- 这里定义了三种对象:人、房子和房间。
-
谓词:
- “In(person, room)”
- “Owns(person, house)”
- 这些谓词描述了对象之间的关系和状态。
-
初始状态:
- “In(Alice, Living_Room), Owns(Alice, House1)”
- 初始状态描述了对象和谓词的初始值。
-
目标规格:
- “In(Alice, Kitchen)”
- 目标规格定义了规划任务的成功条件。
-
动作/运算符:
- “Move(person, room)”
- “Enter(person, house)”
- 这些动作/运算符定义了智能体可以执行的操作。
Planning tasks specified in PDDL are separated into two files:
1 A domain file for predicates and actions.
2 A problem file for objects, initial state and goal specification.
领域文件(Domain File)
- 内容:领域文件包含规划领域的常量、谓词、动作和运算符。
- 作用:定义了智能体可以采取哪些动作,以及这些动作如何改变世界状态。
- 示例:在上面提供的 gripper 领域文件示例中,定义了谓词如 “room”、“ball”、“gripper” 等,以及动作 “move”、“pick” 和 “drop”。
问题文件(Problem File)
- 内容:问题文件包含规划问题的对象、初始状态和目标规格。
- 作用:定义了智能体需要解决的具体问题,包括哪些对象是重要的、初始状态下世界是什么样的,以及智能体需要达到的目标状态。
- 示例:在 gripper 问题文件中,定义了初始状态如 “In(Alice, Living_Room), Owns(Alice, House1)”,以及目标规格如 “In(Alice, Kitchen)”。
规划任务的分解
Domain Files
<domain name> is a string that identifies the planning domain,
e.g. gripper.
<domain name>
用于为每个规划领域指定一个唯一的名称,以区分不同的问题类型。每个规划领域都有其特定的规则和操作,这使得规划系统能够针对每个领域定制解决方案。例如,一个名为 “gripper” 的领域可能涉及抓取器操作,而另一个名为 “rover” 的领域可能涉及机器人导航。每个领域都有其独特的约束和目标,因此需要不同的规划策略来解决。通过使用不同的 <domain name>
,规划系统能够识别和处理特定领域的规划问题,从而更有效地生成解决方案。
Example on the web: gripper.pddl.、
Problem Files
<problem name>is a string that identifies the planning task, e.g. gripper-four-balls.
<domain name>must match the domain name in the corresponding domain file. Example on the web: gripper-one.pddl.
,<problem name>
是一个字符串,用于标识规划任务。它是在定义问题(problem)时使用的,以明确区分不同的规划任务。每个规划任务都可以有一个唯一的名称,这个名称通常以文件的形式存在,例如 “gripper-four-balls.pddl”。
在PDDL文件中,<problem name>
指定了规划任务的名称,以便规划系统能够识别和处理该任务的特定细节。<problem name>
必须与对应的领域文件(domain file)中的 <domain name>
匹配。例如,如果一个规划任务的文件名为 “gripper-one.pddl”,那么它的 <domain name>
必须是 “gripper”。这种匹配确保了规划系统能够正确地关联规划领域和规划任务的定义,从而有效地解决规划问题。
Running Example
• Gripper task with four balls:
There is a robot that can move between two rooms and pick up or drop balls with
either of his two arms. Initially, all balls and the robot are in the first room. We want
the balls to be in the second room.
• Objects: The two rooms, four balls and two robot arms.
• Predicates: Is x a room? Is x a ball? Is ball x inside room y? Is robot arm x empty? [...]
• Initial state: All balls and the robot are in the first room. All robot arms are empty.
[...]
• Goal specification: All balls must be in the second room.
• Actions/Operators: The robot can move between rooms, pick up a ball or drop a ball.
象(Objects)
- 房间:两个房间,分别称为 “Room1” 和 “Room2”。
- 球:四个球,分别称为 “Ball1”、“Ball2”、“Ball3” 和 “Ball4”。
- 机器人手臂:两只机器人手臂,分别称为 “Arm1” 和 “Arm2”。
谓词(Predicates)
- 房间谓词:例如 “Is(Room1, room)” 表示 “Room1” 是一个房间。
- 球谓词:例如 “Is(Ball1, ball)” 表示 “Ball1” 是一个球。
- 球在房间中的谓词:例如 “In(Ball1, Room1)” 表示 “Ball1” 在 “Room1” 中。
- 机器人手臂空谓词:例如 “Empty(Arm1)” 表示 “Arm1” 是空的。
初始状态(Initial state)
- 所有球和机器人都在第一个房间:例如 “In(Ball1, Room1), In(Ball2, Room1), In(Ball3, Room1), In(Ball4, Room1), In(Arm1, Room1), In(Arm2, Room1)”。
- 所有机器人手臂都是空的:例如 “Empty(Arm1), Empty(Arm2)”。
目标规格(Goal specification)
- 所有球都必须在第二个房间:例如 “In(Ball1, Room2), In(Ball2, Room2), In(Ball3, Room2), In(Ball4, Room2)”。
动作/运算符(Actions/Operators)
- 机器人可以在房间之间移动:例如 “Move(Arm1, Room1, Room2)” 表示 “Arm1” 从 “Room1” 移动到 “Room2”。
- 机器人可以捡起球:例如 “Pickup(Ball1, Arm1)” 表示 “Arm1” 捡起 “Ball1”。
- 机器人可以放下球:例如 “Drop(Ball1, Arm1)” 表示 “Arm1” 放下 “Ball1”。
解决方案
- 可能的解决方案:
- 机器人可以先用一只手臂将球从第一个房间移动到第二个房间。
- 然后,机器人可以用另一只手臂捡起第一个房间中的球,并将它们移动到第二个房间。
- 最后,机器人将所有球放在第二个房间中。
这个例子展示了一个简单的抓取器任务,其中机器人需要将四个球从第一个房间移动到第二个房间。通过定义对象、谓词、初始状态、目标规格和动作,我们可以使用PDDL来描述和解决这个规划问题。这种方法使得规划器能够更好地处理规划问题,并找到有效的解决方案。
Gripper Task: Objects
• Objects:
Rooms: rooma, roomb
Balls: ball1, ball2, ball3, ball4
Robot arms: left, right
• In PDDL:
( :objects rooma roomb
ball1 ball2 ball3 ball4
left right )
Gripper task: Predicates
Gripper Task: Initial State
• Initial State:
room(rooma) and room(roomb) are true.
ball(ball1), ..., ball(ball4) are true.
gripper(left), gripper(right), free(left) and free(right) are true.
at-robby(rooma), at-ball(ball1, rooma), ..., at-ball(ball4, rooma) are true.
Everything else is false.
• In PDDL
Gripper Task: Goal Specification
• Goal Specification:
at-ball(ball1, roomb), ..., at-ball(ball4, roomb) must be true.
Everything else, we don’t care about.
• In PDDL:
Gripper Task: Movement Operator
Gripper Task: Pick-up Operator
Gripper Task: Drop Operator
A note on Action Effects
• Action effects can be more complicated than seen so far.
• They can be universally quantified:
(forall (?v1 ... ?vn)
<effect>)
• They can be conditional:
(when <condition>
<effect>)
• Example on the web: crazy-switches.pddl
-
普遍量化:
- 动作效果可以使用普遍量化(universal quantification)来表示,这意味着效果对所有可能的情况都成立。
- 普遍量化形式为
(forall (?v1 ... ?vn) <effect>)
,其中?v1 ... ?vn
是变量,<effect>
是效果的描述。 - 例如,一个普遍量化的效果可能是
(forall (?ball) (in ?ball room2))
,表示所有球都在房间2中。
-
条件效果:
- 动作效果也可以是条件性的,这意味着效果只在满足特定条件时才发生。
- 条件效果形式为
(when <condition> <effect>)
,其中<condition>
是效果发生的条件,<effect>
是效果的描述。 - 例如,一个条件效果可能是
(when (empty ?arm) (pickup ?ball ?arm))
,表示当手臂为空时,捡起球。
Exercise
• Formalise the actions of the Blocks
World Domain:
• Predicates:
— on(A,B) - A is on B
— block(B) - B is a block
— clear(B) - B is clear
• Objects: Blocks a, b and c; table (always clear)Start State Goal State
(in STRIPS)
Init(On(A, Table) ∧ On(B, Table) ∧ On(C, A)
∧ Block (A) ∧ Block (B) ∧ Block (C) ∧ Clear (B) ∧ Clear (C))
Goal (On(A, B) ∧ On(B, C))
Action(Move(b, x, y),
PRECOND: On(b, x) ∧ Clear (b) ∧ Clear (y) ∧ Block (b) ∧ Block (y) ∧
(b" =x) ∧ (b" =y) ∧ (x"=y),
EFFECT: On(b, y) ∧ Clear (x) ∧ ¬On(b, x) ∧ ¬Clear (y))
Action(MoveToTable (b, x),
PRECOND: On(b, x) ∧ Clear (b) ∧ Block (b) ∧ (b" =x),
EFFECT: On(b, Table) ∧ Clear (x) ∧ ¬On(b, x))
-
Init(On(A, Table) ∧ On(B, Table) ∧ On(C, A)
- 这行代码定义了规划问题的初始状态。
Init
是STRIPS中的一个关键字,用于定义初始状态。On(A, Table)
表示方块A
在桌子Table
上。On(B, Table)
表示方块B
在桌子Table
上。On(C, A)
表示方块C
在方块A
上。
-
∧ Block (A) ∧ Block (B) ∧ Block © ∧ Clear (B) ∧ Clear ©)
- 这行代码继续定义了初始状态。
Block (A)
表示方块A
是一个块。Block (B)
表示方块B
是一个块。Block (C)
表示方块C
是一个块。Clear (B)
表示方块B
是空的。Clear (C)
表示方块C
是空的。
-
Goal (On(A, B) ∧ On(B, C))
- 这行代码定义了规划问题的目标状态。
Goal
是STRIPS中的一个关键字,用于定义目标状态。On(A, B)
表示方块A
在方块B
上。On(B, C)
表示方块B
在方块C
上。
-
Action(Move(b, x, y),
- 这行代码定义了一个名为
Move
的动作。 Action
是STRIPS中的一个关键字,用于定义动作。Move
是动作的名称。(b, x, y)
是动作的参数,其中b
是移动的方块,x
是方块b
当前的位置,y
是方块b
目标位置。
- 这行代码定义了一个名为
-
PRECOND: On(b, x) ∧ Clear (b) ∧ Clear (y) ∧ Block (b) ∧ Block (y) ∧ (b" =x) ∧ (b" =y) ∧ (x"=y),
- 这行代码定义了
Move
动作的前提条件。 PRECOND
是STRIPS中的一个关键字,用于定义动作的前提条件。On(b, x)
表示方块b
在位置x
上。Clear (b)
表示位置b
是空的。Clear (y)
表示位置y
是空的。Block (b)
表示方块b
是一个块。Block (y)
表示位置y
是一个块。(b" =x) ∧ (b" =y) ∧ (x"=y)
表示方块b
移动后位置不变,即b
从x
移动到y
。
- 这行代码定义了
-
EFFECT: On(b, y) ∧ Clear (x) ∧ ¬On(b, x) ∧ ¬Clear (y))
- 这行代码定义了
Move
动作的效果。 EFFECT
是STRIPS中的一个关键字,用于定义动作的效果。On(b, y)
表示方块b
现在在位置y
上。Clear (x)
表示位置x
现在是空的。¬On(b, x)
表示方块b
不再在位置x
上。¬Clear (y)
表示位置y
不再是空的。
- 这行代码定义了
-
Action(MoveToTable (b, x),
- 这行代码定义了一个名为
MoveToTable
的动作。 Action
是STRIPS中的一个关键字,用于定义动作。
- 这行代码定义了一个名为
PDDL Domain
-
(define (domain blocks))
- 这行代码定义了一个名为
blocks
的规划领域。 define
是PDDL中的一个关键字,用于定义一个领域。(domain blocks)
定义了一个名为blocks
的规划领域。
- 这行代码定义了一个名为
-
(:requirements :strips)
- 这行代码指定了
blocks
规划领域必须满足的要求。 requirements
是PDDL中的一个关键字,用于指定领域的要求。:strips
表示该领域使用STRIPS风格的谓词逻辑。
- 这行代码指定了
-
(:constants-def table)
- 这行代码定义了一个名为
table
的常量。 constants-def
是PDDL中的一个关键字,用于定义常量。table
是常量的名称。
- 这行代码定义了一个名为
-
(:predicates ( on ?a ?b ) ( block ?b ) ( clear ?b ) )
- 这行代码定义了一组谓词。
predicates
是PDDL中的一个关键字,用于定义谓词。on ?a ?b
表示一个谓词,其中?a
和?b
是变量,用于表示两个对象之间的关系。block ?b
表示一个谓词,其中?b
是变量,用于表示一个对象是否是块。clear ?b
表示一个谓词,其中?b
是变量,用于表示一个对象是否是空的。
-
(:action move
- 这行代码定义了一个名为
move
的动作。 action
是PDDL中的一个关键字,用于定义动作。move
是动作的名称。
- 这行代码定义了一个名为
-
:parameters ( ?b ?x ?y )
- 这行代码指定了
move
动作的参数。 parameters
是PDDL中的一个关键字,用于指定动作的参数。?b ?x ?y
是参数的名称,其中?b
、?x
和?y
是变量。
- 这行代码指定了
-
:precondition ( and ( on ?b ?x ) ( clear ?y ) ( clear ?b ) ( block ?b ) ( block ?y ) )
- 这行代码定义了
move
动作的前提条件。 precondition
是PDDL中的一个关键字,用于定义动作的前提条件。( and ( on ?b ?x ) ( clear ?y ) ( clear ?b ) ( block ?b ) ( block ?y ) )
是一个合取,表示所有条件必须同时满足。
- 这行代码定义了
-
:effect ( and ( on ?b ?y ) ( clear ?x ) ( not ( on ?b ?x ) ) ( not ( clear ?y ) ) )
- 这行代码定义了
move
动作的效果。 effect
是PDDL中的一个关键字,用于定义动作的效果。( and ( on ?b ?y ) ( clear ?x ) ( not ( on ?b ?x ) ) ( not ( clear ?y ) ) )
是一个合取,表示执行动作后,状态将如何变化。
- 这行代码定义了
-
(:action moveToTable
- 这行代码定义了一个名为
moveToTable
的动作。 action
是PDDL中的一个关键字,用于定义动作。moveToTable
是动作的名称。
- 这行代码定义了一个名为
-
:parameters ( ?b ?x )
- 这行代码指定了
moveToTable
动作的参数。 parameters
是PDDL中的一个关键字,用于指定动作的参数。?b ?x
是参数的名称,其中?b
和?x
是变量。
- 这行代码指定了
-
11:precondition ( and ( on ?b ?x ) ( clear ?b ) ( block ?b ) ( clear ?x ) )
- 这行代码定义了
moveToTable
动作的前提条件。 precondition
是PDDL中的一个关键字,用于定义动作的前提条件。( and ( on ?b ?x ) ( clear ?b ) ( block ?b ) ( clear ?x ) )
是一个合取,表示所有条件必须同时满足。
- 这行代码定义了
-
12:effect ( and ( on ?b table ) ( clear ?x ) ( not ( on ?b ?x ) ) )
- 这行代码定义了
moveToTable
动作的效果。 effect
是PDDL中的一个关键字,用于定义动作的效果。( and ( on ?b table ) ( clear ?x ) ( not ( on ?b ?x ) ) )
是一个合取,表示执行动作后,状态将如何变化。
- 这行代码定义了
PDDL Problem Definition
-
(define (problem pb1))
- 这行代码定义了一个名为
pb1
的规划问题。 define
是PDDL中的一个关键字,用于定义一个问题。(problem pb1)
定义了一个名为pb1
的规划问题。
- 这行代码定义了一个名为
-
(:domain blocks)
- 这行代码指定了
pb1
规划问题使用的规划领域。 domain
是PDDL中的一个关键字,用于指定问题使用的领域。blocks
是之前定义的规划领域名称。
- 这行代码指定了
-
(:objects a b c table)
- 这行代码定义了
pb1
规划问题中的对象。 objects
是PDDL中的一个关键字,用于定义问题中的对象。a b c table
是对象列表,其中a b c
是方块的名称,table
是桌子的名称。
- 这行代码定义了
-
(:init ( on a table ) ( on b table ) ( on c a )
- 这行代码定义了
pb1
规划问题的初始状态。 init
是PDDL中的一个关键字,用于定义初始状态。( on a table ) ( on b table ) ( on c a )
表示方块a
在桌子table
上,方块b
在桌子table
上,方块c
在方块a
上。
- 这行代码定义了
-
( block a ) ( block b ) ( block c ) ( clear b ) ( clear c ) )
- 这行代码继续定义了
pb1
规划问题的初始状态。 block a ) ( block b ) ( block c ) ( clear b ) ( clear c )
表示方块a
、b
和c
都是块,方块b
和c
都是空的。
- 这行代码继续定义了
-
(:goal ( and ( on a b ) ( on b c ) ) )
- 这行代码定义了
pb1
规划问题的目标状态。 goal
是PDDL中的一个关键字,用于定义目标状态。( on a b ) ( on b c )
表示方块a
在方块b
上,方块b
在方块c
上。
- 这行代码定义了