0

我是 PDDL 的新手,我一直在尝试 blocksworld 问题,但我得到了错误:

无法解析问题——不是 args 必须是只有一个元素的列表,得到 [Primitive sobre (default_object ?obj, default_object ?obj2), Primitive libre (default_object ?obj3), Primitive en (default_object ?obj, default_object ?from )] /tmp/solver_planning_domains_tmp_4BmsZdP37zJXS/domain.pddl: 第 16 行语法错误, '(': 需要域定义

我的文件是这些:

(define (domain blocly)
   (:predicates (espacio ?e)  
        (ficha ?t)  
        (sobre ?t ?t)  
        (en ?t ?e)  
        (vacio ?e)  
        (libre ?t))  


    (:action movefichaficha
       :parameters (?ficha ?ficha2 ?ficha3 ?from ?to)
       :precondition (and  (ficha ?ficha) (ficha ?ficha2) (ficha ?ficha3) (espacio ?from) (espacio ?to)
                     (sobre ?ficha ?ficha2) (libre ?ficha) (libre ?ficha3) (en ?ficha ?from) (en ?ficha2 ?from) 
                     (en ?ficha3 ?to))
       :effect (and (sobre ?ficha ?ficha3) (en ?ficha ?to) (libre ?ficha2)
               (not (sobre ?ficha ?ficha2) (libre ?ficha3) (en ?ficha ?from)))) 

    (:action movefichaesp
       :parameters (?ficha ?ficha2 ?from ?to)
       :precondition (and  (ficha ?ficha) (ficha ?ficha2) (espacio ?from) (espacio ?to)
                     (sobre ?ficha ?ficha2) (vacio ?to) (en ?ficha ?from) (en ?ficha2 ?from))
       :effect (and  (libre ?ficha2) (en ?ficha ?to) (arriba ?ficha ?to)
               (not (vacio ?to) (en ?ficha ?from) (sobre ?ficha ?ficha2))))

    (:action moveoespficha
       :parameters  (?ficha ?ficha2 ?from ?to)
       :precondition (and  (ficha ?ficha) (ficha ?ficha2) (espacio ?from) (espacio ?to)
                     (libre ?ficha) (libre ?ficha2) (en ?ficha ?from) (en ?ficha ?to) ())
       :effect (and  (vacio ?from) (en ?ficha ?to) (sobre ?ficha ?ficha2)
             (not (libre ?ficha2) (en ?ficha ?from) (en ?ficha ?from)))))

还有这些:

(define (problem blockly-world)  
   (:domain blocly)  
   (:objects t1 t2 t3 e1 e2 e3)  
   (:init (ficha t1)   
          (ficha t2)  
          (ficha t3)  
          (espacio e1)  
          (espacio e2)  
          (espacio e3)  
          (sobre t3 t2)  
          (sobre t2 t1)  
          (en t1 e1)  
          (en t2 e1)  
          (en t3 e1)  
          (libre t3)  
          (vacio e2)  
          (vacio e3))  
   (:goal (and (sobre t1 t2)  
               (sobre t2 t3)))  
4

1 回答 1

1

源代码中存在许多问题。

  • 问题文件缺少final)

  • not逻辑运算符使用不当,例如

    (not (vacio ?to) (en ?ficha ?from) (sobre ?ficha ?ficha2))
    

    应该改写为

    (not (vacio ?to))
    (not (en ?ficha ?from))
    (not (sobre ?ficha ?ficha2))
    
  • 域文件使用未声明的谓词arriba. 由于它具有相同的定义en-- 并且在该块中没有提到 -- (:init ...),我不确定这是否是由于重命名arribaen忘记更改最后一次出现而导致的拼写错误。以防万一它不是错误,您可以通过添加来修复它

     (arriba ?t ?e)
    

    到谓词列表。您应该自行检查是否需要在问题文件(:init ...)中的块中添加内容。


下面,您可以找到正确缩进的源代码版本,其中对前两个已识别问题进行了充分修复,并尝试解决第三个问题:

块状prob.pddl:

(define (problem blockly-world)  
    (:domain blocly)  
    (:objects t1 t2 t3 e1 e2 e3)  
    (:init
          (ficha t1)   
          (ficha t2)  
          (ficha t3)  
          (espacio e1)  
          (espacio e2)  
          (espacio e3)  
          (sobre t3 t2)  
          (sobre t2 t1)  
          (en t1 e1)  
          (en t2 e1)  
          (en t3 e1)  
          (libre t3)  
          (vacio e2)  
          (vacio e3)
    )  
   (:goal (and
              (sobre t1 t2)
              (sobre t2 t3)
          )
   )
) 

块域.pddl:

(define (domain blocly)
    (:predicates
        (espacio ?e)  
        (ficha ?t)  
        (sobre ?t ?t)  
        (en ?t ?e)
        (arriba ?t ?e)
        (vacio ?e)  
        (libre ?t)
    )  

    (:action movefichaficha
        :parameters (?ficha ?ficha2 ?ficha3 ?from ?to)
        :precondition
            (and
                (ficha ?ficha)
                (ficha ?ficha2)
                (ficha ?ficha3)
                (espacio ?from)
                (espacio ?to)
                (sobre ?ficha ?ficha2)
                (libre ?ficha)
                (libre ?ficha3)
                (en ?ficha ?from)
                (en ?ficha2 ?from) 
                (en ?ficha3 ?to)
            )
        :effect
            (and
                (sobre ?ficha ?ficha3)
                (en ?ficha ?to)
                (libre ?ficha2)
                (not (sobre ?ficha ?ficha2))
                (not (libre ?ficha3))
                (not (en ?ficha ?from))
            )
    )

    (:action movefichaesp
        :parameters (?ficha ?ficha2 ?from ?to)
        :precondition
            (and
                (ficha ?ficha)
                (ficha ?ficha2)
                (espacio ?from)
                (espacio ?to)
                (sobre ?ficha ?ficha2)
                (vacio ?to)
                (en ?ficha ?from)
                (en ?ficha2 ?from)
            )
        :effect
            (and
                (libre ?ficha2)
                (en ?ficha ?to)
                (arriba ?ficha ?to)
                (not (vacio ?to))
                (not (en ?ficha ?from))
                (not (sobre ?ficha ?ficha2))
            )
    )

    (:action moveoespficha
        :parameters  (?ficha ?ficha2 ?from ?to)
        :precondition
            (and
                (ficha ?ficha)
                (ficha ?ficha2)
                (espacio ?from)
                (espacio ?to)
                (libre ?ficha)
                (libre ?ficha2)
                (en ?ficha ?from)
                (en ?ficha ?to) 
            )
        :effect
            (and
                (vacio ?from)
                (en ?ficha ?to)
                (sobre ?ficha ?ficha2)
                (not (libre ?ficha2))
                (not (en ?ficha ?from))
                (not (en ?ficha ?from))
            )
    )
)

该代码由我机器上的PDDL求解器fast-downward.py正确解析,它也找到了解决方案。由于我不知道您要建模的内容,因此我无法验证它是否与您要建模的内容相匹配。


注意:即使您只是出于个人原因学习,请考虑养成使用英文名称作为谓词、宾语和变量的习惯。此外,请考虑缩进源代码并正确描述您正在处理的情况具有吸引赞成票和对您的问题的良好答案的双重好处。

于 2017-09-01T21:24:10.180 回答