The FlatZinc documentation says that only non-standard predicates must be declared at the top of a FlatZinc model:
Predicates used in the model that are not standard FlatZinc must be declared at the top of a FlatZinc model, before any other lexical items. Predicate declarations take the form
<predicate-item> ::= "predicate" <identifier> "(" [ <pred-param-type> : <identifier> "," ... ] ")" ";"
source: link
Apparently, the mzn2fzn compiler adds half-reified predicate declarations at the top of compiled files (see: this github issue):
predicate int_eq_imp(var int: a, var int: b, var bool: r);
I find this behavior somewhat confusing, because half-reified predicates appear to be part of the standard.
Q:
- Isn't this a bug, since only non-standard predicates should be declared at the top of the file?
- Is there a way to suppress such declarations?