PDDL中Requirements是非常重要的,一般我们可以从不同版本的PDDL的all requirements中获取到当前版本PDDL所支持的语法,同时在requirements中添加参数可以判断所使用规划器是否支持某项语法(也可以直接看规划器所对应的论文中提到的requirements入手),可以说requirements是学习每个版本PDDL不可缺少的一步。
我们也无可避免可能遇到规划器声明支持但实际中却仅仅为语法解析支持的漏洞。。。
下面是我整理的从PDDL到PDDL3.0所有的requirements以及其简单介绍
:STRIPS
(:requirements :strips)
允许使用STRIPS中指定的基本添加和删除效果。
; Add:
:effect (walls-built ?s)
; Delete:
:effect (not (walls-built ?s))
:TYPING
(:requirements :typing)
允许使用对象键入。键入类似于面向对象编程中的类和子类
(:types
site material - object
bricks cables windows - material
)
:Preferences
(:requirements :preferences)
允许在问题定义(软目标)中使用偏好。
:Constraints
(:requirements :constraints)
允许在领域定义中使用约束(必须在每个 state中满足的目标)
(:constraints
(and
(forall (?l - lorry ?loc - location) (at-most-once (at ?l ? loc)))
))
:Numeric Fluents
(:requirements :numeric-fluents)
允许包含:function表示域中数字变量的块。
(:functions
(battery-amount ?r - rover)
)
:Durative Actions
(:requirements :durative-actions)
允许durative-action在领域定义中使用。持续行动是指具有完成持续时间的行动。
(:durative-action move
:parameters (<arguments>)
:duration (= ?duration 5)
:condition (logical_expression)
:effect (logical_expression)
)
:Durative Inequalities
(:requirements :durative-inequalities)
允许使用不等式来表示持续时间。我们可以表达一个动作具有使用不等式的持续时间范围,而不是表达动作具有固定的时间长度。
:continuous Effects
(:requirements :continuous-effects)
允许在持续行动中对数字使用连续效果。由于持续性操作需要一段时间,因此我们可以将数值中的更改建模为时间函数。实际上支持这种不稳定。线性函数对于规划者来说相对容易,但非线性效应仍然是研究领域。
:Negative Preconditions
(:requirements :negative-preconditions)
允许not在前提条件下使用。一些规划者模仿行动的方式意味着他们无法处理负前提条件。对于每个谓词来说,这是一个严重的设计缺陷,这更加带来不便,因为它们是一个对立的谓词,当它是假的时候是真的。即rover-charged并且rover-not-charged是相互排斥的。在负前提条件不支持的情况下,我们可以引入第二个谓词,它表示我们想要表达负前提条件的谓词的否定。
:derived Predicates
(:requirements :derived-predicates)
允许在领域中使用派生谓词
(:derived (train-usable ?t
(and
(train-has-guard ?t
(train-has-driver ?t
)
)
:Timed Initial Literals
(:requirements :timed-initial-literals)
允许在定义问题时使用Timed Initial Literals
(at 10 (train-not-in-use t1))
:Disjunctive Preconditions
(:requirements :disjunctive-preconditions)
允许使用or目标和前提条件
(or
(walls-built ?s)
(windows-fitted ?s)
)
:Equality
(:requirements :equality)
(not (= ?s1 ?s2))
:Existential Preconditions
(:requirements :existential-preconditions)
(exists (?c - crane)
(crane-is-free ?c)
)
:Universal Preconditions
(:requirements :universal-preconditions)
(forall (?c - crane)
(crane-is-free ?c)
)
:Quantified Preconditions
(:requirements :quantified-preconditions)
相当于
(:requirements :existential-preconditions :universal-preconditions)
:Conditional Effects
(:requirements :conditional-effects)
允许使用when表达动作效果。基本上说如果某些事情是真的,那么也应用这个效果。
(when
;Antecedent
(and (has-hot-chocolate ?p ?c) (has-marshmallows ?c))
;Consequence
(and (person-is-happy ?p))
)
:Action Expansions
(:requirements :action-expansions)
允许使用动作扩展。这允许定义变体条件和动作的效果。从本质上讲,我们可以定义一个MOVE动作来描述一个人的运动,但包括不同的扩展来描述飞机,火车,汽车或步行的运动。 这已经变得多余,因为我们只是表达多个动作,如MOVE-BY-PLANE
和MOVE-BY-TRAIN
。
:Foreach Expansions
(:requirements :foreach-expansions)
允许使用foreach动作扩展,基本上允许在一种对象或所有对象中应用效果。该要求意味着要求的存在,:action-expansions
因此等同于(:requirements :action-expansions :foreach-expansions)
:DAG Expansions
(:requirements :dag-expansions)
允许标记Action Expansions中描述的扩展,以便您可以区分计划程序选择的子操作。例如,如果我们定义了一个move使用不同传输模式的动作,我们可能想要确切地知道标记使用了什么模式。该要求意味着要求的存在,:action-expansions因此等同于(:requirements :action-expansions :dag-expansions)
:Domain Axioms
(:requirements :domain-axioms)
允许使用公理。公理本质上是其他谓词隐含的谓词。
参阅PDDL 1.2域参考中的公理部分
:subgoals through Axioms
(:requirements :subgoals-through-axioms)
:Safety Constraints
(:requirements :safety-constraints)
:expression Evaluation
(:requirements :expression-evaluation)
:Fluents
(:requirements :fluents)
:Open World
(:requirements :open-world)
在计划中,假定所有未知值都是假的。也就是说,如果我们不知道谓词的值,那么我们认为它是假的。这被称为“封闭世界”假设。这个要求改变了计划者做出“开放世界”的假设。也就是说,未知的值不一定是错误的。这在现代规划者中很少得到支持,并且通常是计划执行中的标志,而不是域中的要求。
:True Negation
(:requirements :true-negation)
:ADL
(:requirements :adl)
:UCPOP
(:requirements :ucpop)
请注意并不是每个requirements规划器都需要支持的,不同规划器的“特长”不同及其支持的语法也各有不同。
更为详细或具体的requirements可以去planning.wiki中查看。