问题描述
我在理解pddl时遇到问题,我正在尝试制定太空飞船计划,只要船长和导航员在桥上,太空飞船就可以移动到某个区域。
(:action travel :parameters (?x ?y)
:precondition (and (REGION ?x) (REGION ?y) ; travel between regions
(at-region ?x) (at-bridge ?x) (at-bridge ?y))
:effect (and (at-region ?y)
(not (at-region ?x)))
)
当我尝试此问题文件时
(:init (SUBMARINE submarine)
(ROOM bridge) (ROOM sickbay) ; 2 rooms - bridge and sickbay
(PERSONNEL captain) (PERSONNEL navigators)
(REGION regionempty) (REGION seaport)
(at-region seaport) (at-bridge captain) (at-bridge navigators)
)
(:goal (and (at-region regionempty))
)
我遇到错误:ff:目标可以简化为FALSE。没有计划可以解决
解决方法
问题出在您的操作及其参数的先决条件中。您仅声明两个参数?x
和?y
。对于那些人,您需要保留五样东西才能使旅行动作可执行:
-
(region ?x)
-
(region ?y)
-
(at-region ?x)
-
(at-bridge ?x)
-
(at-bridge ?y)
问题出在数字4和5。?x
和?x
应该是您要旅行的区域(即1.-3。)所表达的区域。但是然后您说区域 ?x
也必须在桥(4.)处,而区域 ?y
必须在新娘处(5.)。这里的要点是,对于旅行动作的一个实例,您必须为每个变量s.t选择一个值。所有前提条件都同时存在。
解决您的问题的方法是添加两个附加参数:
(:action travel :parameters (?x ?y ?p1 ?p2)
:precondition (and (REGION ?x) (REGION ?y) ; travel between regions
(at-region ?x) (at-bridge ?p1) (at-bridge ?p1))
:effect (and (at-region ?y)
(not (at-region ?x)))
)
最后,您未键入PDDL,并使用一元谓词检查类型。这已经过时了。出于建模目的,应始终使用类型化变量。即引入区域,人员,潜艇等类型...动作定义如下所示:
(:action travel :parameters (?x ?y - region ?p1 ?p2 - personnel)
:precondition (and (at-region ?x) (at-bridge ?p1) (at-bridge ?p1))
:effect (and (at-region ?y)
(not (at-region ?x)))
)