pellierd / pddl4j

PDDL4J is an open source library under LGPL license whose purpose of PDDL4J is to facilitate the development of JAVA tools for Automated Planning based on PDDL language (Planning Domain Description Language).
https://lig-membres.imag.fr/pellier/
GNU Lesser General Public License v3.0
143 stars 65 forks source link

Instantiated action has wrong effects #112

Open o-fir opened 1 year ago

o-fir commented 1 year ago

For the action _(do_decontaminate env1 c1)_ of type

(:action do_decontaminate
        :parameters (?env - environment ?c - contamination)
        :precondition (and 
            (contaminated ?env ?c)  
        )
        :effect (and
            (not(contaminated ?env ?c))
        )
    )

the positive effects include (contaminated env1 c1)

Code to display effects of all actions:

 for (int i = 0; i < problem.getTasks().size(); i++) {
                Task t = problem.getTasks().get(i);
                if (t.isPrimtive()) {
                    Action ac = problem.getActions().get(i);
                    BitVector pos = ac.getUnconditionalEffect().getPositiveFluents();
                    BitVector neg = ac.getUnconditionalEffect().getNegativeFluents();
                    System.out.println("ACTION: " + PrintFunctions.taskToString(i, problem));

                    for (int g = pos.nextSetBit(0); g >= 0; g = pos.nextSetBit(g + 1)) {
                        System.out.println("+++ " + PrintFunctions.predicateToString(g, problem));
                    }
                    for (int g = neg.nextSetBit(0); g >= 0; g = neg.nextSetBit(g + 1)) {
                        System.out.println("--- " + PrintFunctions.predicateToString(g, problem));
                    }
                }
            }

    public static String predicateToString(int index, Problem problem) {
        Fluent f = problem.getFluents().get(index);
        String tmp = "";
        tmp += problem.getPredicateSymbols().get(f.getSymbol()) + "(";

        for (Integer i : f.getArguments()) {
            tmp += problem.getConstantSymbols().get(i) + ", ";
        }
        tmp += ")";
        return tmp;
    }

DOMAIN:

; problem is performing experiments
; experiments are performed in the lab by 2 scientists, after which lab equipment must be rearranged by 1 scientist
; labs are accessed via ports
; a new person can't enter a lab, if there is already someone inside.
; only one person can enter via port

(define (domain quarantine)
    (:requirements :hierarchy :negative-preconditions :equality :typing :method-preconditions)

    (:types
        contamination
        subject
        environment
        experiment
        decontamination-procedure
    )

    (:predicates
        (assigned ?e - experiment ?env - environment)
        (contaminated ?e - environment ?c - contamination)
        (carrier ?s - subject ?c - contamination)
        (decontamination-type ?d - decontamination-procedure ?c - contamination)
        (experiment-type ?e - experiment ?c - contamination)
    )

    (:task perform_experiment
        :parameters (?e - experiment)
    )

    (:task contaminate
        :parameters (?env - environment ?c - contamination)
    )

    (:task decontaminate
        :parameters (?env - environment ?c - contamination)
    )

    (:method m0_perform_experiment
        :parameters (?e - experiment ?c - contamination ?env - environment)
        :task (perform_experiment ?e)
        :precondition (and
            (experiment-type ?e ?c)
        )
        :ordered-subtasks (and
            (contaminate ?env ?c)
            (do_experiment ?e ?env ?c)
            (decontaminate ?env ?c)
        )
    )

    (:method m0_contaminate
        :parameters (?env - environment ?c - contamination)
        :task (contaminate ?env ?c)
        :precondition (and
            (not(contaminated ?env ?c))
        )
        :ordered-subtasks (and
            (do_contaminate ?env ?c)
        )
    )
    (:method m1_contaminate
        :parameters (?env - environment ?c - contamination)
        :task (contaminate ?env ?c)
        :precondition (and
            (contaminated ?env ?c)
        )
        :ordered-subtasks (and
            (nop)
        )
    )
    (:method m0_decontaminate
        :parameters (?env - environment ?c - contamination ?d - decontamination-procedure)
        :task (decontaminate ?env ?c)
        :precondition (and
            (contaminated ?env ?c)
            (decontamination-type ?d ?c)
        )
        :ordered-subtasks (and
            (do_clear_environment ?env)
            (do_initiate_decontamination ?env ?d)
            (do_decontaminate ?env ?c)
        )
    )
    (:method m1_decontaminate
        :parameters (?env - environment ?c - contamination)
        :task (decontaminate ?env ?c)
        :precondition (and
            (not(contaminated ?env ?c))
        )
        :ordered-subtasks (and
            (nop)
        )
    )

    (:action do_experiment
        :parameters (?e - experiment ?env - environment ?c - contamination)
        :precondition (and 
            (contaminated ?env ?c)
            (experiment-type ?e ?c)
        )
        :effect (and
        )
    )

    (:action do_contaminate
        :parameters (?env - environment ?c - contamination)
        :precondition (and )
        :effect (and
            (contaminated ?env ?c)
        )
    )

    (:action do_clear_environment
        :parameters (?env - environment)
        :precondition (and )
        :effect (and
        )
    )

    (:action do_initiate_decontamination
        :parameters (?env - environment ?d - decontamination-procedure)
        :precondition (and )
        :effect (and
        )
    )

    (:action do_decontaminate
        :parameters (?env - environment ?c - contamination)
        :precondition (and 
            (contaminated ?env ?c)  
        )
        :effect (and
            (not(contaminated ?env ?c))
        )
    )

    (:action nop
    :parameters ()
    :precondition ()
    :effect ())
)

PROBLEM:

; num_oven: 2
; num_brick: 4
; num_temp: 2

(define
   (problem pfile0)
   (:domain quarantine)
   (:objects
      c1 - contamination
      e1 e2 e3 - experiment
      env1 - environment
      d1 - decontamination-procedure
   )

   (:htn
      :parameters ()
      :subtasks (and
         (task0 (perform_experiment e1))
         (task1 (perform_experiment e2))
         (task2 (perform_experiment e3))
      )
   )

   (:init
      (experiment-type e1 c1)
      (experiment-type e2 c1)
      (experiment-type e3 c1)
      (decontamination-type d1 c1)
   )
)