关于PDDL中when子句是否修改谓词的技术咨询
解答
核心结论:属于理解误区
PDDL中的when子句是纯条件触发逻辑,规则明确:
when的条件部分(第一个括号内的内容)仅负责读取当前状态的谓词值,不会修改任何谓词。- 只有当条件满足时,才会执行
when的效果部分(第二个括号内的内容),这部分才会对状态中的谓词进行修改。
针对你的疑问的具体说明
- 你提到的检查
(light-on ?room),这个判断只是查看当前该房间的灯是否处于亮着的状态,绝对不会自动把它设为True。如果需要修改这个谓词的状态,必须在when的效果部分明确写出对应的操作:比如(light-on ?room)是将该谓词设为真,(not (light-on ?room))是将其设为假。 - 看你提供的
toggle-light动作里的第一个when子句:
这里的(when (and (not(light-on ?room)) (vampire-is-in ?room) (not(light-on ?clockwise-neighbor))) (and (light-on ?room) (not(vampire-is-in ?room)) (vampire-is-in ?clockwise-neighbor)) )(not(light-on ?room))只是读取当前灯的状态,只有当所有条件都满足时,才会执行效果里的(light-on ?room)来打开灯——这才是修改谓词的动作,而非条件判断本身。
你的领域定义中的问题提示
- 语法错误:
toggle-light动作的效果块里,第五个效果缺少开头的(when(原代码里被注释掉了开头,但后面的括号没匹配),会导致PDDL解析失败,需要补全或者删除这段无效代码。 - 逻辑冗余:前三个when子句的条件存在大量重叠(都是针对灯未亮且吸血鬼在房间的场景),可能会导致效果冲突或者预期外的行为,建议合并逻辑,减少重复判断。
内容的提问来源于stack exchange,提问作者Mes
相关产品推荐
相关产品推荐

