如何在PDDL中加入条件?

how to put conditions in PDDL?

我正在学习如何将 PDDL 用于 IA class,我必须编写一个计划,我需要从位置 4 接一个人并将其放到位置 1,还要在位置 3 接一个人并将它也放在 location1 中。我已经有了移动到位置的代码选择人,移动到目标位置并放下它。但是有一些规则我不能放在代码上,有一个连接路径我需要遵循但我不知道如何放置这些条件:

这是连接路径: Loction1 -> Location2 -> Location4 -> Location3

我有从一个位置到另一个位置的代码,但我不知道如何在不能直接从位置 1 到位置 4 的位置设置条件

代码如下:

域:

(定义(域planeacion_Str)

(:predicates (Hospital ?h)
    (Ambulancia ?a)
    (Location ?l)
    (Paciente ?px)
    (Libre ?a)
    (Ocupado ?a ?px)
    (at-ambulancia ?l)
    (at-paciente ?px ?l)
    
)

(:action Conducir
    :parameters  (?de ?para)
   :precondition (and  (Location ?de) (Location ?para) (at-ambulancia ?de))
   :effect (and  (at-ambulancia ?para)
         (not (at-ambulancia ?de)))
)

(:action subirPaciente
    :parameters (?pcte ?lctn ?amblnc)
   :precondition  (and  (Paciente ?pcte) (Location ?lctn) (Ambulancia ?amblnc)
            (at-paciente ?pcte ?lctn) (at-ambulancia ?lctn) (Libre ?amblnc))
   :effect (and (Ocupado ?pcte ?amblnc)
        (not (at-paciente ?pcte ?lctn)) 
        (not (Libre ?amblnc)))
)

(:action bajarPaciente
    :parameters  (?pcte ?lctn ?amblnc)
   :precondition  (and  (Paciente ?pcte) (Location ?lctn) (Ambulancia ?amblnc)
            (Ocupado ?pcte ?amblnc) (at-ambulancia ?lctn))
   :effect (and (at-paciente ?pcte ?lctn)
        (Libre ?amblnc)
        (not (Ocupado ?pcte ?amblnc)))
))

(定义(问题practica_Planeacion_pblm) (:域 planeacion_Str) (:objects l1 l2 l3 l4 amblnc px1 px2 医院) (:init (医院 l1) (Ambulancia amblnc) (位置 l1) (位置 l2) (位置 l3) (地点l4) (Paciente px1) (Paciente px2) (自由 amblnc) (at-ambulancia l1) (at-paciente px1 l4) (at-paciente px2 l3) ) (:goal (and (at-paciente px1 l1) (at-paciente px2 l1) ) ) )

希望有人能帮助我。

你需要在你的移动动作中添加一个前提条件,即你只能在相邻位置之间移动;然后在初始状态中添加相邻位置列表作为谓词:

(adjacent location1 location2)   
(adjacent location2 location3)

但不是 (adjacent location1 location4)