目前的數字,只能通過這樣的方式來定義。
z = zero()
one = next(z)
two = next(one)
three = next(two)
four = next(three)
而且除了定義之外,我們對這些數字還不能做什麼。
讓我們首先建立自然數的加法運算。
我們利用歸納公理,這樣定義加法的規則:
根據規則②,我們可以看到
n+one(n+「zero的後繼」)=> n+ next(z) => next(n+z) => next(n)
n+two(等於n+「one的後繼」)=> n+ next(one) => next(n+one) => next(next(n))
...以此類推
然後我們用python的**來實現這個規則(自然數加法nadd)。
def nadd(a1, a2):
if iszero(a2):
return a1
return nnext(nadd(a1, npre(a2)))
**說明幾乎可以省略了,歸納公理,非常恰當地用遞迴來實現。
為了驗證加法的正確性,我們再根據自然公理定義一下什麼叫做兩個自然數相等。
公理④說明:不同元素有不同的後繼。那麼顯然根據逆否命題,如果兩個自然數的前驅相同,就代表這兩個自然數相同。
我們這樣定義相等的規則:
自然數相等(neq)的**實現如下:
def neq(a1, a2):
if iszero(a1) and iszero(a2):
return true
elif iszero(a1) or iszero(a2):
return false
else:
return neq(npre(a1), npre(a2))
**說明也相當直接:如果a1和a2同時為none,肯定是相同;否則,兩者任何單一為none都說明不相同。兩個數字都不為none時,則取決於他們的前驅是否相同。這時,我們可以做一些測試。
from nature import *
import pytest
def test_basic():
z = zero()
one = nnext(z)
two = nnext(one)
three = nnext(two)
four = nnext(three)
five = nnext(four)
a= nnext(zero())
b= nadd(z, one)
c= npre(a)
d= nadd(two, three)
e= nadd(two, four)
# 這個時候還沒有-1的定義,應當報錯
with pytest.raises(typeerror):
minusone= npre(z)
# 不相同判斷
assert not neq(two, one)
assert not neq(b, three)
assert not neq(four, nnext(five))
# 相同判斷
assert neq(z, npre(one))
assert neq(d, five)
assert neq(e, nnext(five))
# 加法交換律
assert neq(nadd(three, four), nadd(four, three))
# 加法結合律
assert neq(nadd(five, nadd(three, four)), nadd(nadd(five, three), four))
測試用了pytest,用法相當簡潔的乙個測試框架。 瓜瓜學數學,數字8
瓜瓜從小愛看紅綠燈,她覺得數字會一秒一秒的變化,好神奇啊 時間一長,瓜瓜寫數字的習慣都受到了影響,她總喜歡把數字 畫 成數碼管字型的樣式,例如數字 8 瓜瓜會寫成如下圖所示的形式。但是這樣寫好慢啊,身為程式設計師的巴巴要幫她用程式畫出來,以 和空格拼出數字8的數碼管字型樣式,而且大小還是可變的!瓜瓜...
python入門4 認識資料型別
在python裡為了應對不同的業務需求,也把資料分為不同的型別 數值分為兩類 inte 整型 例如1 2 3 4 5 6 float 浮點型 例如1.23 2.44 6.1132 500.3411113 布林型分為兩類 通常判斷問題 true 真 false 假 str 字串 特點 資料都帶 lis...
python數學知識 數學知識回顧01
常見函式 常見函式 y c 一次函式 y ax b 二次函式 y ax 2 bx c 冪函式y x a 指數函式 y a x,a的取值範圍為 a 0 a 1 對數函式 y loga x a的取值範圍為 a 0 a 1 導數乙個函式在某一點的導數描述了這個函式在這一點附近的變化率,也可以認為是函式在某...