In [61]:
class 集合(frozenset):
    def __str__(self):
        return "{"+", ".join(str(x) for x in sorted(self))+"}"
    def __repr__(self):
        return "{"+", ".join(repr(x) for x in sorted(self))+"}"
    def __or__(self, other):
        return 集合(super().__or__(other))
    def __and__(self, other):
        return 集合(super().__and__(other))
In [73]:
 = 集合()

Out[73]:
數(0)
In [74]:
集合([, ])
Out[74]:
數(1)
In [75]:
def S(x):
    return x|集合([x])
In [76]:
 = S()

Out[76]:
數(1)
In [77]:
 = S()

Out[77]:
數(2)
In [78]:
 = S()

Out[78]:
數(3)
In [79]:
 ==集合([,, ])
Out[79]:
True
In [80]:
def (i):
    if i == 0:
        return 
    return S((i-1))
(3) == 
Out[80]:
True
In [81]:
class 集合(frozenset):
    def __str__(self):
        if (len(self)) == self:
            return "數(%d)"%len(self)
        return "{"+", ".join(str(x) for x in sorted(self))+"}"
    def __repr__(self):
        if (len(self)) == self:
            return "數(%d)"%len(self)
        return "{"+", ".join(repr(x) for x in sorted(self))+"}"
    def __or__(self, other):
        return 集合(super().__or__(other))
    def __and__(self, other):
        return 集合(super().__and__(other))
    def __sub__(self, other):
        return 集合(super().__sub__(other))

$\alpha + 0 = \alpha $

$\alpha + S(\beta) = S(\alpha + \beta) $

In [84]:
加法表 = dict()
α = 
for i in range(100):
    加法表[α, ] = α
    α = S(α)
In [87]:
加法表[, ]
Out[87]:
數(3)
In [88]:
上次結果 = 加法表
for i in range(30):
    新結果 = dict()
    for α,β in 上次結果:
        新結果[α, S(β)] = S(上次結果[α, β])
    加法表.update(新結果)
    上次結果 = 新結果
In [91]:
加法表[, ] == 加法表[, ]
Out[91]:
True
In [92]:
加法表[, ]
Out[92]:
數(5)
In [93]:
加法表[(7), (5)] == 加法表[(5), (7)] == (12)
Out[93]:
True
In [95]:
加法表[, (9)]
Out[95]:
數(9)

$\alpha \times 0 = 0 $

$\alpha \times S(\beta) = \alpha \times \beta + \alpha $

In [96]:
乘法表 = dict()
α = 
for i in range(11):
    乘法表[α, ] = 
    α = S(α)
In [97]:
上次結果 = 乘法表
for i in range(9):
    新結果 = dict()
    for α,β in 上次結果:
        新結果[α, S(β)] = 加法表[上次結果[α, β],α]
    乘法表.update(新結果)
    上次結果 = 新結果
In [98]:
乘法表[(3), (5)]
Out[98]:
數(15)
In [99]:
乘法表[(5), (3)]
Out[99]:
數(15)
In [100]:
乘法表[(5), (6)]
Out[100]:
數(30)
In [101]:
乘法表[(2), (4)]
Out[101]:
數(8)
In [102]:
from itertools import chain, combinations, combinations_with_replacement as comb
def 冪集(iterable):
    "powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)"
    s = list(iterable)
    return 集合(集合(x) for x in chain.from_iterable(combinations(s, r) for r in range(len(s)+1)))
In [103]:
原有集合 = 集合(集合([]))
Level = [集合([])]
In [108]:
第一種 = 集合( 集合([s1, s2]) for s1, s2 in comb(原有集合, 2))
第二種 = 集合( s1|s2 for s1, s2 in comb(原有集合, 2)) 
新的集合 = 第一種 | 第二種
Level.append(新的集合-原有集合)
原有集合 = 原有集合 | 新的集合
for l in Level:
    print(list(l))
[數(0)]
[數(1)]
[數(2), {數(1)}]
[{{數(1)}}, {數(0), 數(2)}, {數(0), {數(1)}}, {數(2)}, {數(1), {數(1)}}, {{數(1)}, 數(2)}, {數(1), 數(2)}]
[{數(0), {{數(1)}, 數(2)}}, {數(0), {數(1)}, 數(2)}, {數(0), 數(1), {數(1)}, 數(2)}, 數(3), {{數(1), {數(1)}}, {數(2)}}, {數(0), {數(1), {數(1)}}}, {{數(1), 數(2)}}, {{數(2)}, {數(1), 數(2)}}, {{數(1)}, {數(0), {數(1)}}}, {{數(1)}, {數(1), 數(2)}}, {{{數(1)}, 數(2)}, {數(1)}}, {{數(1), 數(2)}, {數(0), {數(1)}}}, {{數(1), {數(1)}}, {數(0), 數(2)}}, {{{數(1)}}, {數(1)}}, {{數(2)}, {{數(1)}, 數(2)}}, {數(1), {數(1)}, 數(2)}, {{{數(1)}}, {數(1), 數(2)}}, {數(0), 數(1), {數(1)}}, {{{數(1)}}, {數(1), {數(1)}}}, {數(2), {{數(1)}, 數(2)}}, {數(2), {數(2)}}, {{數(0), 數(2)}, {數(1)}}, {{數(1)}, {數(1), {數(1)}}}, {數(1), {數(2)}}, {數(2), {{數(1)}}}, {{數(1), {數(1)}}, {{數(1)}, 數(2)}}, {{{數(1)}}, 數(1)}, {{{數(1)}, 數(2)}, {數(0), 數(2)}}, {{數(1), {數(1)}}, {數(0), {數(1)}}}, {{數(0), 數(2)}, {數(1), 數(2)}}, {{數(2)}, {數(0), 數(2)}}, {{數(0), 數(2)}}, {數(0), {數(0), {數(1)}}}, {{數(0), {數(1)}}, {數(2)}}, {數(2), {數(0), {數(1)}}}, {數(1), {數(1), 數(2)}}, {數(1), {數(0), {數(1)}}}, {數(2), {數(1), 數(2)}}, {數(2), {數(0), 數(2)}}, {{數(1)}, {數(2)}}, {{{數(1)}}, {{數(1)}, 數(2)}}, {數(1), {數(0), 數(2)}}, {數(0), {{數(1)}}}, {{數(1), {數(1)}}, 數(1)}, {數(2), {數(1), {數(1)}}}, {{{數(1)}}, {數(2)}}, {{{數(1)}}}, {{{數(1)}, 數(2)}, {數(1), 數(2)}}, {{{數(1)}, 數(2)}, {數(0), {數(1)}}}, {{{數(1)}, 數(2)}}, {數(0), {數(0), 數(2)}}, {{數(0), {數(1)}}}, {{{數(1)}}, {數(0), {數(1)}}}, {{{數(1)}}, {數(0), 數(2)}}, {{{數(1)}, 數(2)}, 數(1)}, {{數(2)}}, {{數(0), 數(2)}, {數(0), {數(1)}}}, {{數(1), {數(1)}}, {數(1), 數(2)}}, {數(0), {數(2)}}, {數(0), {數(1), 數(2)}}, {{數(1), {數(1)}}}]
In [109]:
[len(x) for x in Level]
Out[109]:
[1, 1, 2, 7, 61]