There are some connections which the author doesn't make which I find a little surprisingly unsaid.
For example, of course you find the Sierpinski pattern under disjointness. Here's some LiveScript to handle disjointness with integers representing bitwise vectors of "x is in the set" (1) or "x is not in the set" (0):
fmt = (x) -> if x then 'o' else ' '
display = console.log . (.join '\n') . (.map (.join '')) . (.map (.map fmt))
display [[(x .&. y) == 0 for y from 0 to 63] for x from 0 to 63]
This displays the 64x64 Sierpinski just fine. Why does it do that? Recursion. Look at the (x, y) pairs when we go from size 2^n to 2^(n + 1): there are four quadrants corresponding to the original (x, y) pairs:
(x, y) (x + 2^n, y)
(x, y + 2^n) (x + 2^n, y + 2^n)
But this is just adding one more bit to our bitmask: clearly the pattern we see in the first three quadrants is simply the pattern we had before; the pattern in the last is blank. It's that recursion which does Sierpinski recursion.
Now, of course if you find a Sierpinski triangle under the is_disjoint_from relation, you find it under the is_subset_of operation -- because A is disjoint from B if and only if B is a subset of the set-complement of A. So as long as your picture "mirrors" in one axis under set complements, of course you're going to see the same pattern for subsets as for disjoints.
The same thing happens when the author says, "The binary operation I found in our little binary binomial table was NOTing n, ANDing the result with k, and then NOTing that: ¬(¬n∧k) = n∨¬k." If you have had a logic course, this result "either A or not-B" should look like the expression for "A implies B", a statement that in all the possibilities that we are thinking about, knowing that you are in a situation where A is true means that you know that you're in a situation where B is also true.
Or, put a different way, the situations where B is true are a subset of the situations where A is true. So you can take the subset-of relation and immediately turn it into that binary formula; and conversely this explains why the author complains, "I had to list the subsets in precisely this order to get the right result" -- basically, you have to count in binary to get the right result. (To go the other way you just need the "all true" value -- that is, this formula "A or not B" must hold for all circumstances, so subset-of would in the above code look like `63 == (x .|. 63 - y)`.)
For example, of course you find the Sierpinski pattern under disjointness. Here's some LiveScript to handle disjointness with integers representing bitwise vectors of "x is in the set" (1) or "x is not in the set" (0):
This displays the 64x64 Sierpinski just fine. Why does it do that? Recursion. Look at the (x, y) pairs when we go from size 2^n to 2^(n + 1): there are four quadrants corresponding to the original (x, y) pairs: But this is just adding one more bit to our bitmask: clearly the pattern we see in the first three quadrants is simply the pattern we had before; the pattern in the last is blank. It's that recursion which does Sierpinski recursion.Now, of course if you find a Sierpinski triangle under the is_disjoint_from relation, you find it under the is_subset_of operation -- because A is disjoint from B if and only if B is a subset of the set-complement of A. So as long as your picture "mirrors" in one axis under set complements, of course you're going to see the same pattern for subsets as for disjoints.
The same thing happens when the author says, "The binary operation I found in our little binary binomial table was NOTing n, ANDing the result with k, and then NOTing that: ¬(¬n∧k) = n∨¬k." If you have had a logic course, this result "either A or not-B" should look like the expression for "A implies B", a statement that in all the possibilities that we are thinking about, knowing that you are in a situation where A is true means that you know that you're in a situation where B is also true.
Or, put a different way, the situations where B is true are a subset of the situations where A is true. So you can take the subset-of relation and immediately turn it into that binary formula; and conversely this explains why the author complains, "I had to list the subsets in precisely this order to get the right result" -- basically, you have to count in binary to get the right result. (To go the other way you just need the "all true" value -- that is, this formula "A or not B" must hold for all circumstances, so subset-of would in the above code look like `63 == (x .|. 63 - y)`.)