You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 09:57:55