PDDL嵌套条件效应语法错误问题咨询及解决方案求助
PDDL嵌套when条件语法错误的解决办法
核心问题原因
PDDL(尤其是PDDL 2.1/2.2这类常用版本)不允许在when的效果部分嵌套另一个when,这就是编译器报错的直接原因。when只能作为顶层效果元素,或者在and这类布尔组合中作为并列元素,不能嵌套使用。另外你提供的代码还存在括号不匹配的问题,这也会触发语法错误。
可行解决方案
1. 拆解嵌套逻辑,转化为独立顶层条件
把原本嵌套在when里的子逻辑拆出来,和外层when放在同一个and下,通过合并前置条件来实现等价逻辑。简单来说,就是把“当A成立时,执行B+(当C成立时执行D)”转化为“当A成立时执行B”+“当A且C成立时执行D”,彻底避免嵌套。
2. 修复语法细节问题
检查并补全所有不匹配的括号,确保每个and、not都有对应的闭合括号,这是编译器正常解析的基础。
修正后的示例代码
:effect (and ; 房间灯未开时,打开灯 (when (not (light-on ?room)) (light-on ?room) ) ; 灯未开+吸血鬼在房间+逆时针邻居灯未开:吸血鬼移到逆时针邻居 (when (and (not (light-on ?room)) (vampire-is-in ?room) (not (light-on ?anti-clockwise-neighbor))) (and (not (vampire-is-in ?room)) (vampire-is-in ?anti-clockwise-neighbor)) ) ; 灯未开+吸血鬼在房间+逆时针邻居灯开着:吸血鬼移到顺时针邻居 (when (and (not (light-on ?room)) (vampire-is-in ?room) (light-on ?anti-clockwise-neighbor)) (and (not (vampire-is-in ?room)) (vampire-is-in ?clockwise-neighbor)) ) ; 房间灯开着时,关闭灯 (when (light-on ?room) (not (light-on ?room)) ) ; 灯开着+猎人在房间+顺时针邻居灯开着:猎人移到顺时针邻居 (when (and (light-on ?room) (slayer-is-in ?room) (light-on ?clockwise-neighbor)) (and (not (slayer-is-in ?room)) (slayer-is-in ?clockwise-neighbor)) ) ; 灯开着+猎人在房间+顺时针邻居灯未开:猎人移到逆时针邻居 (when (and (light-on ?room) (slayer-is-in ?room) (not (light-on ?clockwise-neighbor))) (and (not (slayer-is-in ?room)) (slayer-is-in ?anti-clockwise-neighbor)) ) )
逻辑说明
修正后的代码把原本嵌套的多层when拆成了多个独立的when元素,通过合并前置条件(比如把外层的not (light-on ?room)和内层的vampire-is-in ?room合并成一个and条件),实现了和原代码完全一致的逻辑,同时严格符合PDDL的语法规范,不会再触发嵌套语法错误。
内容的提问来源于stack exchange,提问作者matteo
相关产品推荐
相关产品推荐

