现在我们看看,怎样利用皮亚诺公理建立自然数的减法运算体系,以及它的python实现。
减法的规则:
- ①任何数N减去0仍是自己(N-0 => N)
- ②0减去任何非0的数,都产生错误
- ③如果有了N - pre(M)的结果,我们定义N - M的结果为pre(N - pre(M))
python的代码来实现如下(自然数减法nSub)。
def nSub(a1, a2):
if isZero(a2):
return a1
elif isZero(a1):
raise TypeError
else:
return nPre(nSub(a1, nPre(a2)))
这次我们使用的描述方法与实现方法是完全一致的。
加法、减法、乘法,都有保序性,即如果a和b有某种大小关系,并且c是一个不为0的自然数。
那么经过加法、减法、乘法后,即a+c, b+c;a*c, b*c;a-c, b-c(这时必须有 a, b均大于等于c),关系不变。
我们一起进行测试。
def test_sub():
z = zero()
one = nNext(z)
two = nNext(one)
three = nNext(two)
four = nNext(three)
five = nNext(four)
# 一般减法运算
assert nEq(nSub(five, two), three)
# 自相减为0
assert nEq(nSub(three, three), z)
# 减0不变
assert nEq(nSub(four, z), four)
# 加法的逆运算
assert nEq(nAdd(nSub(nGetNum('■■■■■■■■■'), five), five), nGetNum('■■■■■■■■■'))
# 减数超过被减数报错
with pytest.raises(TypeError):
assert nEq(nSub(three, four), one)
# 加法的保序性
assert nLt(nAdd(nGetNum('■■■■■■■■'), two),nAdd(nGetNum('■■■■■■■■■'), two))
# 减法的保序性
assert nLt(nSub(nGetNum('■■■■■■■■'), three),nSub(nGetNum('■■■■■■■■■'), three))
# 乘法的保序性
assert nLt(nMul(nGetNum('■■■■■■■■'), four),nMul(nGetNum('■■■■■■■■■'), four))