module resource_management
  sort declarations
    consume :: actions
    replenish :: actions
    allocate_resource :: actions
    release_resource :: actions

  function declarations
    fluents
      basic
        is_available : entity -> booleans
        available_to : entity * thing -> booleans


  axioms
    available_to(X, Y) if is_available(X).
    -available_to(X, Y) if -is_available(X).

    false if instance(X, consume),
             -defined_object(X).

    false if instance(X, consume),
             -defined_base(X).


    false if instance(X, replenish),
             -defined_object(X).

    false if instance(X, replenish),
             -defined_base(X).


    false if instance(X, allocate_resource),
             -defined_object(X).

    occurs(X) causes -is_available(O) if instance(X, allocate_resource),
                                         object(X, O),
                                         -defined_base(X).

    occurs(X) causes -available_to(O, B) if instance(X, allocate_resource),
                                            object(X, O),
                                            base(X, B).

    impossible occurs(X) if instance(X, allocate_resource),
                            object(X, O),
                            -is_available(O).


    false if instance(X, release_resource),
             -defined_object(X).

    occurs(X) causes is_available(O) if instance(X, release_resource),
                                        object(X, O),
                                        -defined_base(X).

    occurs(X) causes available_to(O, B) if instance(X, release_resource),
                                           object(X, O),
                                           base(X, B).

    impossible occurs(X) if instance(X, release_resource),
                            object(X, O),
                            is_available(O).