任意两个自然数都可以进行加法和乘法。但如果想做减法,在自然数范围内,还受到一些限制。我们的约定是,被减数必须大于或等于减数。前面我们做了两个自然相等的判断,为了这种比较关系,现在我们在前面的基础上做一个扩展,支持全部六种比较的定义。大于,小于,等于,大于等于,小于等于,不等于。
数字的比较规则定义如下:
- ① 0与0相等
- ② 0小于任何数字
- ③ 任何数字大于0
- ④ 两个数字的比较结果,与它们的前驱进行比较的结果相同。
- ⑤ 六种比较关系的定义如下:
- nEq(),等于关系,比较为相等,返回真;其余为假
- nNeq(),不等于关系,比较为大于或者小于,返回真;其余为假
- nGt(),大于关系,比较为大于,返回真;其余为假
- nGtEq(),大于等于关系,比较为大于或等于,返回真;其余为假
- nLT(),小于关系,比较为小于,返回真;其余为假
- nLtEq(),小于等于关系,比较为小于或等于,返回真;其余为假
代码如下:
def compare(a, b):
if (isZero(a) and isZero(b)):
return '='
if isZero(b):
return '>'
if isZero(a):
return '<'
return compare(nPre(a), nPre(b))
def nEq(a1, a2):
return compare(a1, a2)=='='
def nNeq(a1, a2):
temp= compare(a1, a2)
return temp=='>' or temp=='<'
def nGt(a1, a2):
return compare(a1, a2)=='>'
def nGtEq(a1, a2):
temp= compare(a1, a2)
return temp=='>' or temp=='='
def nLt(a1, a2):
return compare(a1, a2)=='<'
def nLtEq(a1, a2):
temp= compare(a1, a2)
return temp=='<' or temp=='='
我们可以再做一些新的测试:
def test_compare():
z = zero()
one = nNext(z)
two = nNext(one)
three = nNext(two)
four = nNext(three)
five = nNext(four)
# 等于关系
assert nEq(nMul(three, four), nGetNum('■■■■■■■■■■■■'))
assert nEq(five, nAdd(two, three))
assert not nEq(five, nMul(two, three))
# 不等于关系
assert nNeq(five, nAdd(one, three))
assert nNeq(two, nGetNum('■■■■■■'))
assert not nNeq(three, nGetNum('■■■'))
# 大于关系
assert nGt(nMul(three, five), nAdd(nGetNum('■■■■■■'), five))
assert nGt(nGetNum('■■■■■■■■■'), nMul(two, four))
assert not nGt(nGetNum('■■■■■■■■■'), nMul(five, four))
assert not nGt(one, one)
# 大于等于关系
assert nGtEq(five, five)
assert nGtEq(nNext(five), five)
assert not nGtEq(one, nNext(five))
# 小于关系
assert nLt(nMul(three, five), nMul(nGetNum('■■■■'), four))
assert nLt(nGetNum('■■■■■■■■■'), nGetNum('■■■■■■■■■■■'))
assert not nLt(nGetNum('■■■■■■■■■■■■'), nMul(three, four))
assert not nLt(one, zero())
# 小于等于关系
assert nLtEq(z, zero())
assert nLtEq(nGetNum('■■■■■■■■■'), nAdd(nGetNum('■■■■■■■■■'), one))
assert not nLtEq(nAdd(nGetNum('■■■■■■■■■'), one), nGetNum('■■■■■■■■■'))
assert not nLtEq(one, z)