==============================|||
Bounded Quantification
==============================|||

---- MODULE Test ----
op == \A x, y \in Nat, z \in Int, a, b, c \in Real : FALSE
op == \E x, y \in Nat, a, b \in Int : TRUE
====

------------------------------|||

(source_file (module (header_line) name: (identifier) (header_line)
  (operator_definition name: (identifier) (def_eq)
    definition: (bounded_quantification
      quantifier: (forall)
      bound: (quantifier_bound
        intro: (identifier)
        intro: (identifier)
        (set_in)
        set: (nat_number_set)
      )
      bound: (quantifier_bound
        intro: (identifier)
        (set_in)
        set: (int_number_set)
      )
      bound: (quantifier_bound
        intro: (identifier)
        intro: (identifier)
        intro: (identifier)
        (set_in)
        set: (real_number_set)
      )
      expression: (boolean)
    )
  )
  (operator_definition name: (identifier) (def_eq)
    definition: (bounded_quantification
      quantifier: (exists)
      bound: (quantifier_bound
        intro: (identifier)
        intro: (identifier)
        (set_in)
        set: (nat_number_set)
      )
      bound: (quantifier_bound
        intro: (identifier)
        intro: (identifier)
        (set_in)
        set: (int_number_set)
      )
      expression: (boolean)
    )
  )
(double_line)))

==============================|||
Verbose Bounded Quantification
==============================|||

---- MODULE Test ----
op == \forall x, y \in Nat, z \in Int, a, b, c \in Real : FALSE
op == \exists x, y \in Nat, a, b \in Int : TRUE
====

------------------------------|||

(source_file (module (header_line) name: (identifier) (header_line)
  (operator_definition name: (identifier) (def_eq)
    definition: (bounded_quantification
      quantifier: (forall)
      bound: (quantifier_bound
        intro: (identifier)
        intro: (identifier)
        (set_in)
        set: (nat_number_set)
      )
      bound: (quantifier_bound
        intro: (identifier)
        (set_in)
        set: (int_number_set)
      )
      bound: (quantifier_bound
        intro: (identifier)
        intro: (identifier)
        intro: (identifier)
        (set_in)
        set: (real_number_set)
      )
      expression: (boolean)
    )
  )
  (operator_definition name: (identifier) (def_eq)
    definition: (bounded_quantification
      quantifier: (exists)
      bound: (quantifier_bound
        intro: (identifier)
        intro: (identifier)
        (set_in)
        set: (nat_number_set)
      )
      bound: (quantifier_bound
        intro: (identifier)
        intro: (identifier)
        (set_in)
        set: (int_number_set)
      )
      expression: (boolean)
    )
  )
(double_line)))

==============================|||
Bounded Quantification With Tuples
==============================|||

---- MODULE Test ----
op == \A <<x, y>> \in Nat, <<z>> \in Int, <<a, b, c>> \in Real : FALSE
op == \E <<x, y>> \in Nat, <<a, b>> \in Int : TRUE
====

------------------------------|||

(source_file (module (header_line) name: (identifier) (header_line)
  (operator_definition name: (identifier) (def_eq)
    definition: (bounded_quantification
      quantifier: (forall)
      bound: (quantifier_bound
        intro: (tuple_of_identifiers (langle_bracket)
          (identifier)
          (identifier)
        (rangle_bracket))
        (set_in)
        set: (nat_number_set)
      )
      bound: (quantifier_bound
        intro: (tuple_of_identifiers (langle_bracket)
          (identifier)
        (rangle_bracket))
        (set_in)
        set: (int_number_set)
      )
      bound: (quantifier_bound
        intro: (tuple_of_identifiers (langle_bracket)
          (identifier)
          (identifier)
          (identifier)
        (rangle_bracket))
        (set_in)
        set: (real_number_set)
      )
      expression: (boolean)
    )
  )
  (operator_definition name: (identifier) (def_eq)
    definition: (bounded_quantification
      quantifier: (exists)
      bound: (quantifier_bound
        intro: (tuple_of_identifiers (langle_bracket)
          (identifier)
          (identifier)
        (rangle_bracket))
        (set_in)
        set: (nat_number_set)
      )
      bound: (quantifier_bound
        intro: (tuple_of_identifiers (langle_bracket)
          (identifier)
          (identifier)
        (rangle_bracket))
        (set_in)
        set: (int_number_set)
      )
      expression: (boolean)
    )
  )
(double_line)))

==============================|||
Mixed Bounded Quantification With Tuples
==============================|||

---- MODULE Test ----
op == \A x, y \in Nat, <<z>> \in Int, a, b, c \in Real : FALSE
op == \E <<x, y>> \in Nat, a, b \in Int : TRUE
====

------------------------------|||

(source_file (module (header_line) name: (identifier) (header_line)
  (operator_definition name: (identifier) (def_eq)
    definition: (bounded_quantification
      quantifier: (forall)
      bound: (quantifier_bound
        intro: (identifier)
        intro: (identifier)
        (set_in)
        set: (nat_number_set)
      )
      bound: (quantifier_bound
        intro: (tuple_of_identifiers (langle_bracket)
          (identifier)
        (rangle_bracket))
        (set_in)
        set: (int_number_set)
      )
      bound: (quantifier_bound
        intro: (identifier)
        intro: (identifier)
        intro: (identifier)
        (set_in)
        set: (real_number_set)
      )
      expression: (boolean)
    )
  )
  (operator_definition name: (identifier) (def_eq)
    definition: (bounded_quantification
      quantifier: (exists)
      bound: (quantifier_bound
        intro: (tuple_of_identifiers (langle_bracket)
          (identifier)
          (identifier)
        (rangle_bracket))
        (set_in)
        set: (nat_number_set)
      )
      bound: (quantifier_bound
        intro: (identifier)
        intro: (identifier)
        (set_in)
        set: (int_number_set)
      )
      expression: (boolean)
    )
  )
(double_line)))

==============================|||
Empty Tuple Quantification (GH tlaplus/tlaplus #888)
:error
==============================|||

---- MODULE Test ----
op == \A <<>> \in STRING : TRUE
====

------------------------------|||

==============================|||
Unbounded Quantification
==============================|||

---- MODULE Test ----
op == \A x : TRUE
op == \E x, y : FALSE
op == \AA x, y, z : TRUE
op == \EE x, y, z, w : FALSE
====

------------------------------|||

(source_file (module (header_line) name: (identifier) (header_line)
  (operator_definition name: (identifier) (def_eq)
    definition: (unbounded_quantification
      quantifier: (forall)
      intro: (identifier)
      expression: (boolean)
    )
  )
  (operator_definition name: (identifier) (def_eq)
    definition: (unbounded_quantification
      quantifier: (exists)
      intro: (identifier)
      intro: (identifier)
      expression: (boolean)
    )
  )
  (operator_definition name: (identifier) (def_eq)
    definition: (unbounded_quantification
      quantifier: (temporal_forall)
      intro: (identifier)
      intro: (identifier)
      intro: (identifier)
      expression: (boolean)
    )
  )
  (operator_definition name: (identifier) (def_eq)
    definition: (unbounded_quantification
      quantifier: (temporal_exists)
      intro: (identifier)
      intro: (identifier)
      intro: (identifier)
      intro: (identifier)
      expression: (boolean)
    )
  )
(double_line)))

==============================|||
Bounded CHOOSE
==============================|||

---- MODULE Test ----
op == CHOOSE x \in Nat : TRUE
====

------------------------------|||

(source_file (module (header_line) name: (identifier) (header_line)
  (operator_definition name: (identifier) (def_eq)
    definition: (choose
      intro: (identifier)
      (set_in)
      set: (nat_number_set)
      expression: (boolean)
    )
  )
(double_line)))

==============================|||
Bounded CHOOSE With Tuple
==============================|||

---- MODULE Test ----
op == CHOOSE <<x, y, z>> \in S : FALSE
====

------------------------------|||

(source_file (module (header_line) name: (identifier) (header_line)
  (operator_definition name: (identifier) (def_eq)
    definition: (choose
      intro: (tuple_of_identifiers (langle_bracket) (identifier) (identifier) (identifier) (rangle_bracket))
      (set_in)
      set: (identifier_ref)
      expression: (boolean)
    )
  )
(double_line)))

==============================|||
Unbounded CHOOSE
==============================|||

---- MODULE Test ----
op == CHOOSE x : TRUE
====

------------------------------|||

(source_file (module (header_line) name: (identifier) (header_line)
  (operator_definition name: (identifier) (def_eq)
    definition: (choose
      intro: (identifier)
      expression: (boolean)
    )
  )
(double_line)))


==============================|||
Unbounded CHOOSE With Tuple
==============================|||

---- MODULE Test ----
op == CHOOSE <<x, y, z>> : FALSE
====

------------------------------|||

(source_file (module (header_line) name: (identifier) (header_line)
  (operator_definition name: (identifier) (def_eq)
    definition: (choose
      intro: (tuple_of_identifiers (langle_bracket) (identifier) (identifier) (identifier) (rangle_bracket))
      expression: (boolean)
    )
  )
(double_line)))
