Hyper Set Language
From Esolang
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={{#1}}; 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) is the set [[x];[x;y]]
- 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={#|[#]};
Comments
Comments are indicated by two equals signs.
Operators
Syntax | Description |
---|---|
(x) | The parentheses for grouping operators. |
x&y | The set containing elements that exist in both of those sets. |
x|y | The set containing all elements that exist in either set. |
x!y | The set containing all elements that exist in x but not y. |
* | The set of all sets (including itself). |
x.y | Create a pair with x on the left and y on the right. |
x/y | The right part of the pair in x that has y as the left part of that pair. |
x\y | Like x/y applied to each element of the set y and the set of all results from that is returned. |
<x | Left part of the pair. |
>x | Right part of the pair. |
x%y | Apply a function x with argument y (same as x/y), with the result as the first element of the set, and then apply function x on the first element to make the second element of output, and then repeat an infinite number of times. |
@ | This can be used in a {} or () block, as described above. Example: (xyz/abc;@/@) is the same as ((xyz/abc)/(xyz/abc)) |
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 {} itself is still only a single value, though.
- The program (*/*) can have all answers possible.
- The program (0/0) 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={{#}\*}; == Power set Russell={[0.#;1.0]/(element_of/(#.#))}\*; == Russell's paradox S={{{(#2/#)/(#1/#)}}}; K={{#1}}; I={#}; == Set of all pairs the left and right part are same unchurch={(#/successor)/0};