include "fzn_regular_regexp.mzn";
include "regular.mzn";

/** @group globals.extensional
  The sequence of values in array \a x  is accepted by the regular
  expression \a r. This constraint generates it's DFA equivalent.

  Regular expressions can use the following syntax:

  - Selection:

     - Concatenation: "12 34", 12 followed by 34.
       (Characters are assumed to be the part of the same number unless split
       by syntax or whitespace.)
     - Union: "7|11", a 7 or 11.
     - Groups: "7(6|8)", a 7 followed by a 6 or an 8.
     - Wildcard: ".", any value within the domain.
     - Classes: "[3-6 7]", a 3,4,5,6, or 7.
     - Negated classes: "[^3 5]", any value within the domain except for a 3 or a 5.

  - Quantifiers:

     - Asterisk: "12*", 0 or more times a 12.
     - Question mark: "5?", 0 or 1 times a 5. (optional)
     - Plus sign: "42+", 1 or more time a 42.
     - Exact: "1{3}", exactly 3 times a 1.
     - At least: "9{5,}", 5 or more times a 9.
     - Between: "7{3,5}", at least 3 times, but at most 5 times a 7.

  Members of enumerated types can be used in place of any integer (e.g., "A B",
  A followed by B). Enumerated identifiers still use whitespace for concatenation.
*/
predicate regular(array[int] of var int: x, string: r) =
          fzn_regular(x, r);
