# Crane planning problem
from graphplanUtils import *

# Types
OBJ = 'Object'
DIR = 'Direction'
LOC = 'Location'

# Instances
truck = Instance('truck', LOC)
crane = Instance('crane', LOC)
crate = Instance('crate', OBJ)
ground = Instance('ground', LOC)

left = Instance('left', DIR)
right = Instance('right', DIR)

Instances = [truck, crane, crate, left, right, ground]

#Start and Goal States
Start = [Proposition('on', crane, left),
        Proposition('on', truck, right),
        Proposition('on', crate, ground),
        Proposition('on', crate, left)]

Goal = [Proposition('on', crane, left), Proposition('on', crate, truck)]


# Variables
v_to_side = Variable('to_side', DIR)
v_from_side = Variable('from_side', DIR)

# Operators
o_pickup = Operator('pickup',
        # Preconditions
        [Proposition('on', crate, ground),
        Proposition('on', crate, v_from_side),
        Proposition('on', crane, v_from_side)],
        # Adds
        [Proposition('on', crate, crane)],
        # Deletes
        [Proposition('on', crate, v_from_side),
        Proposition('on', crate, ground)])

o_swing = Operator('swing',
        # Preconditions
        [Proposition('on', crane, v_from_side),
        Proposition(NOT_EQUAL, v_from_side, v_to_side)],
        # Adds
        [Proposition('on', crane, v_to_side)],
        # Deletes
        [Proposition('on', crane, v_from_side)])

o_load = Operator('load',
        # Preconditions
        [Proposition('on', crane, v_from_side),
        Proposition('on', truck, v_from_side),
        Proposition('on', crate, crane)],
        # Adds
        [Proposition('on', crate, v_from_side),
        Proposition('on', crate, truck)],
        # Deletes
        [Proposition('on', crate, crane)])

Operators=[o_pickup, o_swing, o_load]

#Problems
prob1 = GraphPlanProblem('dockloading',
    # Instances
    Instances,
    # Operators
    Operators,
    # Initial state
    Start,
    # Goals
    Goal)

prob1.solve()
prob1.display()

# prob1.dump()
