A functional transformation from x to y (i.e., one where each value for x is assigned a single value for y) is best done through the element constraint when possible. The constraint takes an array that maps the domain of x to the domain of y, starting at the zero...

I'm a little confused of what you think is a bug and there are some other issues. The output of the model seems fine with the "cdr([1,2,3])" giving "[1,2,3]". The name "cdr" suggests that you want the "but first" function, but MiniZinc is a default 1-based system (not 0-based) so...

The call to propagate_impl will return an ExecStatus that is not checked. Not checking the result means that any failure or subsumption reported in propagate_impl will be discarded. Surrounding the call with GECODE_ES_CHECK will check for those cases and return appropriately. This is a clear error, I have not checked...