PDDL错误编译

时间:2017-09-01 13:16:37

标签: compilation pddl

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

  

无法解析问题 - 不是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)))  

1 个答案:

答案 0 :(得分:0)

源代码中存在许多问题。

  • 问题文件缺少最终)

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

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

    应改写为

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

    来修复它
    en

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

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

<强>块状-prob.pddl:

(:init ...)

阻止-domain.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 解算器 fast-downward.py 正确解析代码,该解算器也找到了解决方案。由于我不知道您要模拟的是什么,我无法验证它是否与您想要建模的匹配。

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