Почему pddl находит решение неполным

Ниже приведена небольшая часть проблемы перехода через реку, написанная на pddl. Я пытался найти решение в двух разных инструментах (editor.planning.domains и stripsfiddle.herokuapp.com), но оба они дали один и тот же результат.

;domain;
(define (domain RiverCrossing)
(:requirements :strips :typing)
(:types 
    Farmer Fox - passengers
)

(:predicates 
     (onLeftBank ?p - passengers)
     (onRightBank ?p - passengers)
)

(:action crossRiverLR
    :parameters (?f - Farmer)
    :precondition (  and (onLeftBank ?f))
    :effect(  and (onRightBank ?f)  )
)
(:action crossRiverRL
    :parameters (?f - Farmer)
    :precondition (  and (onRightBank ?f))
    :effect(  and (onLeftBank ?f)  )
)
(:action crossRiverLRf
    :parameters ( ?fx - Fox ?f - Farmer)
    :precondition (  and (onLeftBank ?f) (onLeftBank ?fx) )
    :effect(  and (onRightBank ?fx) (onRightBank ?f) )
)
(:action crossRiverRLf
    :parameters (?f - Farmer ?fx - Fox)
    :precondition (  and (onRightBank ?f) (onRightBank ?fx) )
    :effect(  and (onLeftBank ?f) (onLeftBank ?fx)  )
)

)

проблема

(define (problem RCP)
(:domain RiverCrossing)
(:objects
    farmer - Farmer
    fox - Fox
    )

(:init
    (onRightBank farmer) (onLeftBank fox)
)

(:goal 
  (and
    (onLeftBank farmer) (onRightBank fox)
  )
)
)

Оба компилятора дают одинаковый результат; Фермер не идет в левый банк

Solution found in 2 steps!
1. crossRiverRL farmer

2. crossRiverLRf fox farmer

Может ли кто-нибудь помочь мне выяснить, в чем я скучаю? Заранее спасибо,

1 ответ

Я понял, что проблема не сводит на нет предыдущую ситуацию (OnLeftBank) после установки следующей ситуации (OnRightBank). Ниже приведен пример исправления, которое я применил ко всем эффектам;

(:action crossRiverLR
    :parameters (?f - Farmer)
    :precondition (  and (onLeftBank ?f))
    :effect(  and (onRightBank ?f) 
                  (not (onLefttBank ?f)) ; **** adding this solved the problem. ****
     )
)
Другие вопросы по тегам