/***
  @groupdef stdlib.ifthenelse Conditionals

  These functions implement conditional (if-then-else-endif) constraints.
*/

/** @group stdlib.ifthenelse Conditional constraint \(\{\a c[i]\land\not\exists \a c[1..i-1]\ \rightarrow\ \a y=\a x[i] \}\)

  This constraint is generated by the compiler for if-then-else expressions.
  The last entry in the \a c array is always the constant true, corresponding
  to the else case.
*/
predicate if_then_else(array[int] of var bool: c, array[int] of int: x, var int: y) =
    fzn_if_then_else_int(c, x, y);
/** @group stdlib.ifthenelse Conditional constraint \(\{\a c[i]\land\not\exists \a c[1..i-1]\ \rightarrow\ \a y=\a x[i] \}\)

  This constraint is generated by the compiler for if-then-else expressions.
  The last entry in the \a c array is always the constant true, corresponding
  to the else case.
*/
predicate if_then_else(array[int] of var bool: c, array[int] of var int: x, var int: y) =
    fzn_if_then_else_var_int(c, x, y);
/** @group stdlib.ifthenelse Conditional constraint \(\{\a c[i]\land\not\exists \a c[1..i-1]\ \rightarrow\ \a y=\a x[i] \}\)

  This constraint is generated by the compiler for if-then-else expressions.
  The last entry in the \a c array is always the constant true, corresponding
  to the else case.
*/
predicate if_then_else(array[int] of var bool: c, array[int] of opt int: x, var opt int: y) =
    fzn_if_then_else_opt_int(c, x, y);
/** @group stdlib.ifthenelse Conditional constraint \(\{\a c[i]\land\not\exists \a c[1..i-1]\ \rightarrow\ \a y=\a x[i] \}\)

  This constraint is generated by the compiler for if-then-else expressions.
  The last entry in the \a c array is always the constant true, corresponding
  to the else case.
*/
predicate if_then_else(array[int] of var bool: c, array[int] of var opt int: x, var opt int: y) =
    fzn_if_then_else_var_opt_int(c, x, y);
/** @group stdlib.ifthenelse Conditional constraint \(\{\a c[i]\land\not\exists \a c[1..i-1]\ \rightarrow\ \a y=\a x[i] \}\)

  This constraint is generated by the compiler for if-then-else expressions.
  The last entry in the \a c array is always the constant true, corresponding
  to the else case.
*/
predicate if_then_else(array[int] of var bool: c, array[int] of bool: x, var bool: y) =
    fzn_if_then_else_bool(c, x, y);
/** @group stdlib.ifthenelse Conditional constraint \(\{\a c[i]\land\not\exists \a c[1..i-1]\ \rightarrow\ \a y=\a x[i] \}\)

  This constraint is generated by the compiler for if-then-else expressions.
  The last entry in the \a c array is always the constant true, corresponding
  to the else case.
*/
predicate if_then_else(array[int] of var bool: c, array[int] of var bool: x, var bool: y) =
    fzn_if_then_else_var_bool(c, x, y);
/** @group stdlib.ifthenelse Conditional constraint \(\{\a c[i]\land\not\exists \a c[1..i-1]\ \rightarrow\ \a y=\a x[i] \}\)

  This constraint is generated by the compiler for if-then-else expressions.
  The last entry in the \a c array is always the constant true, corresponding
  to the else case.
*/
predicate if_then_else(array[int] of var bool: c, array[int] of opt bool: x, var opt bool: y) =
    fzn_if_then_else_opt_bool(c, x, y);
/** @group stdlib.ifthenelse Conditional constraint \(\{\a c[i]\land\not\exists \a c[1..i-1]\ \rightarrow\ \a y=\a x[i] \}\)

  This constraint is generated by the compiler for if-then-else expressions.
  The last entry in the \a c array is always the constant true, corresponding
  to the else case.
*/
predicate if_then_else(array[int] of var bool: c, array[int] of var opt bool: x, var opt bool: y) =
    fzn_if_then_else_var_opt_bool(c, x, y);
/** @group stdlib.ifthenelse Conditional constraint \(\{\a c[i]\land\not\exists \a c[1..i-1]\ \rightarrow\ \a y=\a x[i] \}\)

  This constraint is generated by the compiler for if-then-else expressions.
  The last entry in the \a c array is always the constant true, corresponding
  to the else case.
*/
predicate if_then_else(array[int] of var bool: c, array[int] of float: x, var float: y) =
    fzn_if_then_else_float(c, x, y);
/** @group stdlib.ifthenelse Conditional constraint \(\{\a c[i]\land\not\exists \a c[1..i-1]\ \rightarrow\ \a y=\a x[i] \}\)

  This constraint is generated by the compiler for if-then-else expressions.
  The last entry in the \a c array is always the constant true, corresponding
  to the else case.
*/
predicate if_then_else(array[int] of var bool: c, array[int] of var float: x, var float: y) =
    fzn_if_then_else_var_float(c, x, y);
/** @group stdlib.ifthenelse Conditional constraint \(\{\a c[i]\land\not\exists \a c[1..i-1]\ \rightarrow\ \a y=\a x[i] \}\)

  This constraint is generated by the compiler for if-then-else expressions.
  The last entry in the \a c array is always the constant true, corresponding
  to the else case.
*/
predicate if_then_else(array[int] of var bool: c, array[int] of opt float: x, var opt float: y) =
    fzn_if_then_else_opt_float(c, x, y);
/** @group stdlib.ifthenelse Conditional constraint \(\{\a c[i]\land\not\exists \a c[1..i-1]\ \rightarrow\ \a y=\a x[i] \}\)

  This constraint is generated by the compiler for if-then-else expressions.
  The last entry in the \a c array is always the constant true, corresponding
  to the else case.
*/
predicate if_then_else(array[int] of var bool: c, array[int] of var opt float: x, var opt float: y) =
    fzn_if_then_else_var_opt_float(c, x, y);
/** @group stdlib.ifthenelse Conditional constraint \(\{\a c[i]\land\not\exists \a c[1..i-1]\ \rightarrow\ \a y=\a x[i] \}\)

  This constraint is generated by the compiler for if-then-else expressions.
  The last entry in the \a c array is always the constant true, corresponding
  to the else case.
*/
predicate if_then_else(array[int] of var bool: c, array[int] of set of int: x, var set of int: y) =
    fzn_if_then_else_set(c, x, y);
/** @group stdlib.ifthenelse Conditional constraint \(\{\a c[i]\land\not\exists \a c[1..i-1]\ \rightarrow\ \a y=\a x[i] \}\)

  This constraint is generated by the compiler for if-then-else expressions.
  The last entry in the \a c array is always the constant true, corresponding
  to the else case.
*/
predicate if_then_else(array[int] of var bool: c, array[int] of var set of int: x, var set of int: y) =
    fzn_if_then_else_var_set(c, x, y);
/** @group stdlib.ifthenelse Conditional partiality constraint

  This constraint is generated by the compiler for if-then-else expressions
  with potentially undefined cases.
  The last entry in the \a c array is always the constant true, corresponding
  to the else case.
  The \a d[i] variable represents whether case
  \p i is defined. Constrains that if \b is defined, then the selected case must be defined, and
  if the selected case is undefined, then \a b must be undefined.
*/
predicate if_then_else_partiality(array[int] of var bool: c, array[int] of var bool: d, var bool: b) =
    fzn_if_then_else_partiality(c, d, b);

