Hyper Set Language

Hyper Set Language is an esolang idea by User:Zzo38, based somewhat on Set Language, but, it is possible to have multiple answers, or no answers, or even to have a set of all sets that are not members of themself!

Define
To define a word, you do: word=definition; The semicolon marks the end (although the definitions can also contain semicolons). The name syntax is [A-Za-z_][A-Za-z0-9_]*

Values
All values are sets, although they can be treated as certain kinds of values:
 * Set :Everything is a set. To create, put the values inside [] with semicolons separating the values. It has no order, so each value can either be in the set or not in the set.
 * Function :Is represented by an expression inside of {} and can contain # to access its argument. You can put a number after # to specify the argument of other functions that this one is defined in, such as:  K_combinator=;  The function is a set of pairs, where the left part of the pair is the input value, and the right part of the pair is the output value. You can also chain values by using semicolons inside the definition, the last part is the value of the function, and @ represents the value of the previous part that are separated by semicolons.
 * Pair :This is an ordered pair of two values, one on the left and one on the right. Use the . operator to create a pair. A pair (x.y)</tt> is the set x];[x;y</tt>
 * Number :Natural numbers, expressed as the set of all lower numbers (0 is the null set). You can just type the number directly into the program. That is:  successor={#|[#]}; </tt>

Comments
Comments are indicated by two equals signs.

Multiple Answers
Here are some notes about multiple possible answers for a program:
 * When a function can have no valid answer for a certain input, the set representing that function does not contain a pair with that input on the left side. When there are multiple valid answers, there are multiple pairs with that on the left side.
 * A function {}</tt> itself is still only a single value, though.
 * The program (*/*)</tt> can have all answers possible.
 * The program (0/0)</tt> has no output.

Examples
reverse={(>#).(<#)}; successor={#|[#]}; == Successor of a number predecessor=reverse\successor; == Predecessor of a number not=({0}!(0.0))|(0.1); equal={[<#]&[>#];not/(not/@)}; == Check if two sets are the same naturals=successor%0; fork={({0.#}\#)/0}; subsets={{#1&(fork/*)};{>#}\@}; element_of={[<#]&>#;not/(not/@)}; power={{#&#1}\*}; == Power set Russell={[0.#;1.0]/(element_of/(#.#))}\*; == Russell's paradox S=; K=; I={#}; == Set of all pairs the left and right part are same unchurch={(#/successor)/0};