Documentation
pub mod heuristic;

mod gripper {
    pub const DOMAIN: &'static str = "
(define (domain gripper-strips)
    (:predicates 
        (room ?r)
		(ball ?b)
		(gripper ?g)
		(at-robby ?r)
		(at ?b ?r)
		(free ?g)
		(carry ?o ?g)
    )

    (:action move
        :parameters (?from ?to)
        :precondition (and 
            (room ?from) 
            (room ?to) 
            (at-robby ?from)
        )
        :effect (and  
            (at-robby ?to)
            (not (at-robby ?from))
        )
    )


    (:action pick
        :parameters (?obj ?room ?gripper)
        :precondition (and  
            (ball ?obj)
            (room ?room)
            (gripper ?gripper)
         	(at ?obj ?room)
            (at-robby ?room)
            (free ?gripper)
        )
        :effect (and
            (carry ?obj ?gripper)
		    (not (at ?obj ?room)) 
		    (not (free ?gripper))
        )
    )

    (:action drop
        :parameters (?obj ?room ?gripper)
        :precondition (and
            (ball ?obj)
            (room ?room)
            (gripper ?gripper)
			(carry ?obj ?gripper)
            (at-robby ?room)
        )
        :effect (and
            (at ?obj ?room)
		    (free ?gripper)
		    (not (carry ?obj ?gripper))
        )
    )
)
";
    pub const PROBLEM_UNSOLVED: &'static str = "
(define (problem strips-gripper4)
    (:domain gripper-strips)
    (:objects rooma roomb ball1 ball2 ball3 ball4 left right)
    (:init (room rooma)
           (room roomb)
           (ball ball1)
           (ball ball2)
           (ball ball3)
           (ball ball4)
           (gripper left)
           (gripper right)
           (at-robby rooma)
           (free left)
           (free right)
           (at ball1 rooma)
           (at ball2 rooma)
           (at ball3 rooma)
           (at ball4 rooma))
    (:goal (and 
        (at ball1 roomb)
        (at ball2 roomb)
        (at ball3 roomb)
        (at ball4 roomb))
    )
)";
    pub const PROBLEM_HALFSOLVED: &'static str = "
(define (problem strips-gripper4)
    (:domain gripper-strips)
    (:objects rooma roomb ball1 ball2 ball3 ball4 left right)
    (:init (room rooma)
           (room roomb)
           (ball ball1)
           (ball ball2)
           (ball ball3)
           (ball ball4)
           (gripper left)
           (gripper right)
           (at-robby rooma)
           (free left)
           (free right)
           (at ball1 rooma)
           (at ball2 rooma)
           (at ball3 roomb)
           (at ball4 roomb))
    (:goal (and 
        (at ball1 roomb)
        (at ball2 roomb)
        (at ball3 roomb)
        (at ball4 roomb))
    )
)";
    pub const PROBLEM_SOLVED: &'static str = "
(define (problem strips-gripper4)
    (:domain gripper-strips)
    (:objects rooma roomb ball1 ball2 ball3 ball4 left right)
    (:init (room rooma)
           (room roomb)
           (ball ball1)
           (ball ball2)
           (ball ball3)
           (ball ball4)
           (gripper left)
           (gripper right)
           (at-robby rooma)
           (free left)
           (free right)
           (at ball1 roomb)
           (at ball2 roomb)
           (at ball3 roomb)
           (at ball4 roomb)
    )
    (:goal (and 
        (at ball1 roomb)
        (at ball2 roomb)
        (at ball3 roomb)
        (at ball4 roomb))
    )
)";
}