PDDL forall 语法

Posted

技术标签:

【中文标题】PDDL forall 语法【英文标题】:PDDL forall syntax 【发布时间】:2020-05-13 23:40:21 【问题描述】:

我目前正在从事一个 pddl 项目,但我在语法方面遇到了一些困难。现在,我正试图用 forall 将一个楼层的所有工人填满电梯。我不确定这是否是正确的实现,但这是我的代码。提前谢谢!

(define (domain company)

(:requirements
  :strips                 
  :negative-preconditions 
  :equality               
)

(:predicates
  (worker ?x)
  (floor ?x)
  (elevator ?x)
  (controller ?x)
  (goes ?x )
  (at ?x ?y)  
  (in ?x ?y)
  (free ?x)
  (call ?x ?y)
)

****

(:action insert_elevator
  :parameters (?w ?el ?f)
  :precondition (and (worker ?w) (floor ?f) (elevator ?el) (at ?w ?f) (at ?el ?f) (free ?el))
  :effect (and(not (free ?el))(forall (?w)(in ?w ?el)))
)

****

)



(define (problem pb)
   (:domain company)

   (:objects floorg floor1 floor2
             elevator1
             elevator2
             worker1 worker2
             controller1)

   (:init
     (floor floorg)
     (floor floor1)
     (floor floor2)
     (worker worker1)
     (worker worker2)
     (elevator elevator1)
     (elevator elevator2)
     (controller controller1)
     (at elevator1 floor1)
     (at elevator2 floor2)
     (at worker1 floorg)
     (at worker2 floorg)
     (free elevator1)
     (free elevator2)
   )

   (:goal
     (and(at worker1 floor1)
     (at worker2 floor2))
   )
 )

【问题讨论】:

【参考方案1】:

所以显然你也发布了here...仍然有效的 cmets:

您可以使用editor.planning.domains 和保存的“会话”更好地共享您的代码。 (使用只读链接) 您确实应该为这样的域使用类型。 insert_elevator 操作有点混乱: forall 可能需要包含一个条件效果,表明“如果工人在地板上,那么他们就在电梯里”。 您不应在 forall 子句中使用与参数中相同的变量。

【讨论】:

我已经更改了 forall 变量。你可以在这里看到editor.planning.domains/#read_session=Zf2mJgrqse。但是我该如何设置条件效果呢?感谢您的回复! 确保范围正确...(forall parameters (when condition result) )。请注意,when 子句完全在 forall 子句内。

以上是关于PDDL forall 语法的主要内容,如果未能解决你的问题,请参考以下文章

PDDL forall 与持续动作中的 when 条件

如何在 PDDL forall 中获取 break 的功能

使用 PL/SQL 使用 forall 语法批量插入

继续在教堂的 FORALL 循环之外

为啥 `forall (a :: j) (b:: k)` 与 `forall (p :: (j,k))` 的工作方式不同?

FORALL 插入目标表,然后从源表中删除 FORALL