Forall 语句适用于 PDDL 域中的元素子集?

Posted

技术标签:

【中文标题】Forall 语句适用于 PDDL 域中的元素子集?【英文标题】:Forall statement applied for a subset of elements in PDDL Domain? 【发布时间】:2019-04-17 16:31:21 【问题描述】:

使用案例

首先,我想解释一下我的使用案例:我想将一个领域划分为不同的扇区,所有的植物都应该由机器人分析(每个扇区只有一个机器人)。我要检查:前提条件是一个扇区的所有植物都已分析完毕,以便机器人返回“家”。

问题

这里是域 PDDL。我的问题是放在“tracker-back-home”动作的前提下。现在我正在检查是否已经分析了所有植物,但我需要知道是否分析了特定部门?s 的所有植物。使用forall语句可以吗?

(define (domain killbee)
(:requirements :strips :typing)
(:types 
  bee location - object
  ;Inheritance
  tracker - bee
  hive plant sector - location
)
(:predicates 
  (directly-connected ?l1 - location ?l2 - location)
  (at ?l1 - object ?l2 - object) ;location is hive, plant or sector
  (free-sector ?s - sector)
  (bee-with-sector ?b - tracker)
  (tracker-ready-to-move ?b - tracker)
  (analyzed-plant ?p - plant ?s - sector)
  (sector-tracked ?s - sector)
  (plant-in-sector ?p - plant ?s - sector)
)
...
...
(:action tracker-back-home
:parameters (?b - tracker ?p - plant ?h - hive ?s - sector)
:precondition 
  (and (tracker-ready-to-move ?b)
  (at ?b ?p)
  (not (at ?b ?h))
  (forall (?x - plant) (analyzed-plant ?x ?s)))
  )
:effect 
  (and 
  (not (at ?b ?p))
  (at ?b ?h)
  (sector-tracked ?s)
  (not (bee-with-sector ?b))
  (free-sector ?s))
)...

【问题讨论】:

【参考方案1】:

您是否检查过 PDDL 2.1 定义的“暗示”语言功能? (也许它在 2.1 之前就已经定义了——不确定。)有了它,你可以定义:

(forall (?pPrime - plant)
  (imply (at ?s ?pPrime) (analyzed-plant ?pPrime ?s))
)

注意:我不确定(at ?s ?pPrime)中的参数顺序是否正确。它应该编码植物?pPrime在扇区?s

该条件扩展到大量含义,即所有植物p'(无论它们在哪里)都成立:“if plant p' is in s, then it's analyzed in s”。这应该准确地编码您正在寻找的内容。

【讨论】:

它完全奏效了。只是提到'暗示'语句中的条件是(工厂内部门?pPrime?s)。谢谢! 您的意思是在 imly 语句中应该读为“(plant-in-sector ?pPrime ?s)”而不是“(at ?s ?pPrime)”?我限制在您的示例中定义的那些谓词。那里不存在“部门内工厂”。 你说得对,谓词丢失了,我已经用它更新了帖子。解决方案是: (forall (?pPrime - plant) (imply (plant-in-sector ?pPrime ?s) (analyzed-plant ?pPrime ?s)) )

以上是关于Forall 语句适用于 PDDL 域中的元素子集?的主要内容,如果未能解决你的问题,请参考以下文章

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

PDDL forall 语法

FORALL 循环中的多个 SQL 语句

我似乎无法理解 pddl 中的动作和目标

3)Win10-UWA开发 API參考 - 2

FORALL 子句中的赋值操作