include "fzn_writes_seq.mzn";
include "fzn_writes_seq_reif.mzn";

/** @group globals.array
    Creates a new array \a O from an input array \a I with a sequence of changes at positions \a P to take values \a V

    \a I is an array of integers
    \a O is an array of integers with same index set as \a I
    \a P is an array of index values in \a I
    \a V is an array of integer values 
*/
predicate writes_seq(array[int] of var int: I, array[int] of var int: P,
                     array[int] of var int: V, array[int] of var int: O) =
    assert(index_set(O) = index_set(I),"writes: index set of I must be same as O") /\
    assert(index_set(P) = index_set(V),"writes: index set of P must be same as V") /\
    fzn_writes_seq(I, P, V, O);

function array[int] of var int: writes_seq(array[int] of var int: I,
                 array[int] of var int: P,
                 array[int] of var int: V) = 
    let {
        array[index_set(I)] of var int: O;
        constraint assert(index_set(P) = index_set(V),"writes: index set of P must be same as V");
        constraint fzn_writes_seq(I,P,V,O);
    } in O;

%-----------------------------------------------------------------------------%
