Почему мой PDDL не компилируется? Ошибка разбора - PullRequest
0 голосов
/ 14 апреля 2020

Я новичок в PDDL и пытаюсь решить проблему с роботом-уборщиком, но я не понимаю, почему я это получаю.

чтение ввода ... [t = 0s ] Упрощение переходов ... сделано! закончил чтение ввода! [t = 0s] построение причинного графа ... готово! [t = 0s] упаковка переменных состояния ... готово! [t = 0s] Переменные: 1 Факты: 2 байта на состояние: 4 выполнено инициализация глобальных данных [t = 0s] Выполнение наилучшего первого поиска с повторным открытием закрытых узлов, (реальное) ограничение = 2147483647 Инициализация FF heuristi c ... Инициализация аддитивная эвристика c ... Упрощение 0 унарных операторов ... готово! [0 унарные операторы] Начальное состояние тупик. Полностью исследованное пространство состояний - нет решения! Фактическое время поиска: 0 с [t = 0 с] Расширенное состояние 0 (с). Открыто 0 состояний. Оценивается 1 состояние (я). Оценки: 1 Сгенерировано 0 состояний. Тупики: 0 состояний. Количество зарегистрированных состояний: 1 Время поиска: 0 с Общее время: 0 с Поиск остановлен, не найдя решения. Пиковая память: 2936 КБ

    (define (domain floor-tile)

        (:requirements :typing)

        ;; We have two types: robots and the tiles, both are objects
        (:types robot tile - object)

        ;; define all the predicates as they are used in the probem files
        (:predicates  

        ;; described what tile a robot is at
        (robot-at ?r - robot ?x - tile)

        ;; indicates that tile ?x is above tile ?y
        (up ?x - tile ?y - tile)

        ;; indicates that tile ?x is below tile ?y
        (down ?x - tile ?y - tile)

        ;; indicates that tile ?x is right of tile ?y
        (right ?x - tile ?y - tile)

        ;; indicates that tile ?x is left of tile ?y
        (left ?x - tile ?y - tile)

        ;; indicates that a tile is clear (robot can move there)
        (clear ?x - tile)

        ;; indicates that a tile is cleaned
        (cleaned ?x - tile)
        )

    (:action clear

          :parameters (?r - robot?x - tile ?y - tile)

          :precondition (and (robot-at ?r ?x) (clear ?x))

          :effect (when (cleaned ?x) (not(clear ?x)))
    )


    (:action clean-up

          :parameters (?r - robot ?x - tile ?y - tile)

          :precondition (and (up ?y ?x) (robot-at ?r ?x) (clear ?y))

          :effect (and (robot-at ?r ?y) (not(robot-at ?r ?x))) 
    )


     (:action clean-down

          :parameters (?r - robot?x - tile ?y - tile)

          :precondition (and (down ?y ?x) (robot-at ?r ?x) (clear ?y))

          :effect (and (robot-at ?r ?y) (not(robot-at ?r ?x)))
    )


     (:action up 
         :parameters (?r - robot?x - tile ?y - tile)

         :precondition (and (up ?y ?x) (robot-at ?r ?x) (clear ?y))

         :effect (and (robot-at ?r ?y) (not(robot-at ?r ?x))) 
    )


    (:action down 
         :parameters (?r - robot?x - tile ?y - tile)
         :precondition (and (down ?y ?x) (robot-at ?r ?x)(clear ?y))

         :effect (and (robot-at ?r ?y) (not(robot-at ?r ?x))) 
    )

    (:action right 
         :parameters (?r - robot?x - tile ?y - tile)

         :precondition (and (right ?y ?x) (robot-at ?r ?x) (clear ?y))

         :effect (and (robot-at ?r ?y) (not(robot-at ?r ?x)))    
    )

    (:action left 
         :parameters (?r - robot?x - tile ?y - tile)

         :precondition (and (left ?y ?x) (robot-at ?r ?x) (clear ?y))

         :effect (and (robot-at ?r ?y ) (not(robot-at ?r ?x)))
    )
    )

Проблема:


    (define (problem prob001)
     (:domain floor-tile)
     (:objects tile_0-1 tile_0-2  
               tile_1-1 tile_1-2  
               tile_2-1 tile_2-2  - tile
               robot1 - robot
    )
     (:init 
       (robot-at robot1 tile_1-1)
       (clear tile_0-1)
       (clear tile_0-2)
       (clear tile_1-2)
       (clear tile_2-1)
       (clear tile_2-2)
       (up tile_1-1 tile_0-1)
       (up tile_1-2 tile_0-2)
       (up tile_2-1 tile_1-1)
       (up tile_2-2 tile_1-2)
       (down tile_0-1 tile_1-1)
       (down tile_0-2 tile_1-2)
       (down tile_1-1 tile_2-1)
       (down tile_1-2 tile_2-2)
       (right tile_0-2 tile_0-1)
       (right tile_1-2 tile_1-1)
       (right tile_2-2 tile_2-1)
       (left tile_0-1 tile_0-2)
       (left tile_1-1 tile_1-2)
       (left tile_2-1 tile_2-2)
    )
     (:goal (and
        (cleaned tile_0-1)
        (cleaned tile_0-2)
        (cleaned tile_1-1)
        (cleaned tile_2-2)
    ))

    )

Ответы [ 2 ]

0 голосов
/ 15 апреля 2020

Проблема не может быть решена, так как невозможно очистить плитку.

Если вы посмотрите на результаты действий, ни одно из них не приведет к очистке плитки. Так что цель недостижима. Я полагаю, вы перепутали предикаты clear и clean?

0 голосов
/ 14 апреля 2020

Не просматривал все подробно, но в вашем PDDL есть некоторые очевидные проблемы, которые можно исправить. Например,

  • Оставьте пробел между and и следующим элементом (т. Е. (and(pred может вызвать ошибку)
  • Убедитесь, что вы используете инфиксную запись. Это было бы ошибкой: (when and(cleaned ?x) (not(clear ?x))). Правильная форма будет (when (and (cleaned ?x)) (not(clear ?x))), или даже лучше, (when (cleaned ?x) (not(clear ?x)))
...