======================|||
Empty Set
======================|||

---- MODULE Test ----
op == { }
====

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

(source_file (module (header_line) (identifier) (header_line)
  (operator_definition (identifier) (def_eq)
    (finite_set_literal)
  )
(double_line)))

======================|||
Mistaken Set Filter Test
======================|||

---- MODULE Test ----

op == {x \in Nat}
op == {x \in BOOLEAN, y \in STRING}

====

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

(source_file (module (header_line) name: (identifier) (header_line)
  (operator_definition name: (identifier) (def_eq) definition:
    (finite_set_literal
      (bound_infix_op lhs: (identifier_ref) symbol: (in) rhs: (nat_number_set))
    )
  )
  (operator_definition name: (identifier) (def_eq) definition:
    (finite_set_literal
      (bound_infix_op lhs: (identifier_ref) symbol: (in) rhs: (boolean_set))
      (bound_infix_op lhs: (identifier_ref) symbol: (in) rhs: (string_set))
    )
  )
(double_line)))

======================|||
Mistaken Set Filter Tuples Test
======================|||

---- MODULE Test ----

op == {<<x, y>> \in Nat}

====

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

(source_file (module (header_line) name: (identifier) (header_line)
  (operator_definition name: (identifier) (def_eq) definition:
    (finite_set_literal
      (bound_infix_op
        lhs: (tuple_literal (langle_bracket) (identifier_ref) (identifier_ref) (rangle_bracket))
        symbol: (in)
        rhs: (nat_number_set)
      )
    )
  )
(double_line)))

======================|||
Set Literal
======================|||

---- MODULE Test ----
op == {
  TRUE,
  FALSE,
  ((1 + 2) * 3),
  {1,2,3}
}
====

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

(source_file (module (header_line) name: (identifier) (header_line)
  (operator_definition name: (identifier) (def_eq)
    definition: (finite_set_literal
      (boolean)
      (boolean)
      (parentheses
        (bound_infix_op
          lhs: (parentheses
            (bound_infix_op lhs: (nat_number) symbol: (plus) rhs: (nat_number))
          ) symbol: (mul)
          rhs: (nat_number)
        )
      )
      (finite_set_literal (nat_number) (nat_number) (nat_number))
    )
  )
(double_line)))

======================|||
Set Literal with Jlist
======================|||

---- MODULE Test ----
op == {
  /\ 1
  /\ 2
    }
  /\ 3
====

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

(source_file (module (header_line) name: (identifier) (header_line)
  (operator_definition name: (identifier) (def_eq)
    definition: (bound_infix_op
      lhs: (finite_set_literal
        (conj_list
          (conj_item (bullet_conj) (nat_number))
          (conj_item (bullet_conj) (nat_number))
        )
      )
      symbol: (land)
      rhs: (nat_number)
    )
  )
(double_line)))

======================|||
Set Map
======================|||

---- MODULE Test ----
op == {f(x) : x \in Nat}
====

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

(source_file (module (header_line) name: (identifier) (header_line)
  (operator_definition name: (identifier) (def_eq)
    definition: (set_map
      map: (bound_op name: (identifier_ref) parameter: (identifier_ref))
      generator: (quantifier_bound intro: (identifier) (set_in) set: (nat_number_set))
    )
  )
(double_line)))

======================|||
Set Map with Multiple Generators
======================|||

---- MODULE Test ----
op == {f(x, y, z) : x \in Int, y, z \in Real}
====

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

(source_file (module (header_line) name: (identifier) (header_line)
  (operator_definition name: (identifier) (def_eq)
    definition: (set_map
      map: (bound_op name: (identifier_ref) parameter: (identifier_ref) parameter: (identifier_ref) parameter: (identifier_ref))
      generator: (quantifier_bound intro: (identifier) (set_in) set: (int_number_set))
      generator: (quantifier_bound intro: (identifier) intro: (identifier) (set_in) set: (real_number_set))
    )
  )
(double_line)))


======================|||
Set Filter
======================|||

---- MODULE Test ----
op == {x \in Nat : P(x)}
====

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

(source_file (module (header_line) name: (identifier) (header_line)
  (operator_definition name: (identifier) (def_eq)
    definition: (set_filter
      generator: (quantifier_bound intro: (identifier) (set_in) set: (nat_number_set))
      filter: (bound_op name: (identifier_ref) parameter: (identifier_ref))
    )
  )
(double_line)))

======================|||
Set Filter With Too Many Quantifiers
:error
======================|||

---- MODULE Test ----
op == {x \in Nat, y \in Int : P(x, y)}
====

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

======================|||
Set Filter with Tuple
======================|||

---- MODULE Test ----
op == {<<x, y, z>> \in Nat \X Int \X Real : P(x, y, z)}
====

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

(source_file (module (header_line) name: (identifier) (header_line)
  (operator_definition name: (identifier) (def_eq)
    definition: (set_filter
      generator: (quantifier_bound
        intro: (tuple_of_identifiers (langle_bracket) (identifier) (identifier) (identifier) (rangle_bracket))
        (set_in)
        set: (bound_infix_op
          lhs: (bound_infix_op
            lhs: (nat_number_set)
            symbol: (times)
            rhs: (int_number_set)
          )
          symbol: (times)
          rhs: (real_number_set)
        )
      )
      filter: (bound_op name: (identifier_ref) parameter: (identifier_ref) parameter: (identifier_ref) parameter: (identifier_ref))
    )
  )
(double_line)))

=====================|||
Set Filter Precedence
=====================|||

---- MODULE Test ----
op == {x \in S : x \in T}
====

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

(source_file (module (header_line) name: (identifier) (header_line)
  (operator_definition name: (identifier) (def_eq)
    definition: (set_filter
      generator: (quantifier_bound
        intro: (identifier) (set_in) set: (identifier_ref)
      )
      filter: (bound_infix_op
        lhs: (identifier_ref) symbol: (in) rhs: (identifier_ref)
      )
    )
  )
(double_line)))

======================|||
Set Filter with Jlist
======================|||

---- MODULE Test ----
op == {
  x \in
    /\ A
    /\ B
    /\ C
      :
    /\ D
    /\ E
    /\ F
}
====

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

(source_file (module (header_line) (identifier) (header_line)
  (operator_definition (identifier) (def_eq)
    (set_filter
      (quantifier_bound
        (identifier) (set_in)
        (conj_list
          (conj_item (bullet_conj) (identifier_ref))
          (conj_item (bullet_conj) (identifier_ref))
          (conj_item (bullet_conj) (identifier_ref))
        )
      )
      (conj_list
        (conj_item (bullet_conj) (identifier_ref))
        (conj_item (bullet_conj) (identifier_ref))
        (conj_item (bullet_conj) (identifier_ref))
      )
    )
  )
(double_line)))

