1. 16
1. 2

At first, I laughed. But then I considered what it would feel like to bump a version. The axioms of ZFC only have two ways to build a new finite set, union and pairing, and the empty set is the only prebuilt set.

To bump any version, pair it with the empty set. If your version is a Von Neumann ordinal, then this is a plus-one operation; versions could be mapped to 0, 1, 2, etc. Given two versions (perhaps from two components), we can pair them; if one version is already a pair of versions and the other is a Von Neumann ordinal, then we might write these as pairs, triples, quadruples, etc.

Some operations don’t have semantic-versioning counterparts. We can think of the union of a set as the set of elements of elements. In the previous paragraph, every element of elements is either a Von Neumann ordinal or a tuple, so a union of one of those versions would also be a version. But each ordinal is stepped backwards and each tuple is shorter by one component. Maybe this is analogous to an octopus merge, but I think it’s different.

1. 1

oh gods.

1. 1

This is pretty good, but I think it could be even better if it used a Gödel-like system to encode the sets.

``````E({}) = 1
# Assume x0, x1... are increasing
E({x0, x1, x2, ...}) = 2^E(x0) * 3^(E(x1) - E(x0)) * 5^(E(x2) - E(x1) - E(x0)) * ...
``````

All natural numbers correspond to sets, but never fear; it makes up for this advantage by being incredibly inefficient. Most numbers are duplicates, and the encodings of interesting sets are generally much longer than their symbolic representations.