В чем разница между Link и Path в PDDL?

В домене driverlog в PDDL мы указали ссылки и пути.

(define (domain driverlog)
  (:requirements :typing) 
  (:types         location locatable - object
        driver truck obj - locatable
  )
  (:predicates 
        (at ?obj - locatable ?loc - location)
        (in ?obj1 - obj ?obj - truck)
        (driving ?d - driver ?v - truck)
        (link ?x ?y - location) (path ?x ?y - location)
        (empty ?v - truck)
 )

И способ, которым это определено в проблеме:

(define (problem DLOG-2-2-2)
    (:domain driverlog)
    (:objects
    driver1 - driver
    driver2 - driver
    truck1 - truck
    truck2 - truck
    package1 - obj
    package2 - obj
    s0 - location
    s1 - location
    s2 - location
    p1-0 - location
    p1-2 - location
    )
    (:init
    (at driver1 s2)
    (at driver2 s2)
    (at truck1 s0)
    (empty truck1)
    (at truck2 s0)
    (empty truck2)
    (at package1 s0)
    (at package2 s0)
    (path s1 p1-0)
    (path p1-0 s1)
    (path s0 p1-0)
    (path p1-0 s0)
    (path s1 p1-2)
    (path p1-2 s1)
    (path s2 p1-2)
    (path p1-2 s2)
    (link s0 s1)
    (link s1 s0)
    (link s0 s2)
    (link s2 s0)
    (link s2 s1)
    (link s1 s2)
    )

В чем разница между путями и ссылками? Я пытался создать аналогичную проблему, но пропустил путь, и я продолжаю получать неразрешимую проблему. Как я могу правильно определить путь?

Спасибо!

1 ответ

Решение

Это пользовательские предикаты:

(define (domain driverlog)
  ...
  (:predicates 
        ...
        (link ?x ?y - location) (path ?x ?y - location)
        ...
  )
 )

поэтому их семантика может быть выведена путем проверки соответствующей модели.

И то и другое link а также path являются двоичными предикатами, связывающими два местоположения, предположительно, когда возможно перемещение из одного места в другое. Это соединение является однонаправленным.

Из исходного кода я прочитал, что определены следующие действия:

(:action DRIVE-TRUCK
  :parameters
   (?truck
    ?loc-from
    ?loc-to
    ?driver)
  :precondition
   (and (TRUCK ?truck) (LOCATION ?loc-from) (LOCATION ?loc-to) (DRIVER ?driver) 
   (at ?truck ?loc-from)
   (driving ?driver ?truck) (link ?loc-from ?loc-to))
  :effect
   (and (not (at ?truck ?loc-from)) (at ?truck ?loc-to)))

(:action WALK
  :parameters
   (?driver
    ?loc-from
    ?loc-to)
  :precondition
   (and (DRIVER ?driver) (LOCATION ?loc-from) (LOCATION ?loc-to)
    (at ?driver ?loc-from) (path ?loc-from ?loc-to))
  :effect
   (and (not (at ?driver ?loc-from)) (at ?driver ?loc-to)))

Таким образом, кажется, что два места имеют ссылку, если это возможно DRIVE-TRUCK из одного места в другое, и в двух местах есть путь, если это возможно WALK из одного места в другое.

Больше нечего сказать по этому поводу.

Причина, почему вы продолжаете получать UNSAT потому что вы разместили водителей и грузовики в двух разных местах:

(at driver1 s2)
(at driver2 s2)
(at truck1 s0)
(at truck2 s0)

Поскольку единственная связь среди s0 а также s2 является ссылкой, водители не могут добраться до грузовика (и наоборот). Это потому, что предварительным условием DRIVE-TRUCK является (driving ?driver ?truck), который устанавливается только BOARD-TRUCK если водитель находится в том же месте грузовика.

Вы можете решить эту проблему, создав путь среди s0 а также s2, Тем не менее, это, кажется, противоречит соглашению об именах модели, которая соединяет sX используя только ссылки. Лучшее решение состоит в том, чтобы изменить исходное состояние и поместить грузовик в то же место каждого водителя, или, по крайней мере, в место, которое доступно для WALK действие.

Другие вопросы по тегам