精益,66字节
def s:_->nat->nat|(m+1)(n+1):=(n+1)*(s m n+s m(n+1))|0 0:=1|_ _:=0
在线尝试!
正确性证明
在线尝试!
说明
让我们取消功能:
def s : nat->nat->nat
| (m+1) (n+1) := (n+1)*(s m n + s m (n+1))
| 0 0 := 1
| _ _ := 0
该功能由模式匹配和递归定义,两者均具有内置支持。
我们定义s(m+1, n+1) = (n+1) * (s(m, n) + s(m, n+1)和s(0, 0) = 1,这留下了s(m+1, 0)和s(0, n+1),这两个定义0都由最后一种情况决定。
精益用途lamdba演算的语法,所以s m n是s(m, n)。
现在,证明正确性:我以两种方式陈述它:
def correctness : ∀ m n, fin (s m n) ≃ { f : fin m → fin n // function.surjective f } :=
λ m, nat.rec_on m (λ n, nat.cases_on n s_zero_zero (λ n, s_zero_succ n)) $
λ m ih n, nat.cases_on n (s_succ_zero m) $ λ n,
calc fin (s (nat.succ m) (nat.succ n))
≃ (fin (n + 1) × (fin (s m n + s m (n + 1)))) :
(fin_prod _ _).symm
... ≃ (fin (n + 1) × (fin (s m n) ⊕ fin (s m (n + 1)))) :
equiv.prod_congr (equiv.refl _) (fin_sum _ _).symm
... ≃ (fin (n + 1) × ({f : fin m → fin n // function.surjective f} ⊕
{f : fin m → fin (n + 1) // function.surjective f})) :
equiv.prod_congr (equiv.refl _) (equiv.sum_congr (ih n) (ih (n + 1)))
... ≃ {f // function.surjective f} : s_aux m n
def correctness_2 (m n : nat) : s m n = fintype.card { f : fin m → fin n // function.surjective f } :=
by rw fintype.of_equiv_card (correctness m n); simp
第一个是实际发生的情况:到之间的双射[0 ... s(m, n)-1]和从[0 ... m-1]到的双射[0 ... n-1]。
第二个是通常所说的,即s(m, n)从[0 ... m-1]到的基数的基数[0 ... n-1]。
精益使用类型论作为基础(而不是集合论)。在类型论中,每个对象都有其固有的类型。nat是自然数的类型,并且0是自然数的语句表示为0 : nat。我们说这0是类型nat,并且nat具有0居民身份。
命题(陈述/断言)也是类型:其居民是命题的证明。
def:我们将介绍一个定义(因为双射实际上是一个函数,而不仅仅是命题)。
correctness:定义的名称
∀ m n:对于每个m和n(精益会自动推断出其类型为nat,这是由于以下原因)。
fin (s m n)是小于的自然数类型s m n。要成为居民,请提供一个自然数并证明其小于s m n。
A ≃ B:类型A和类型之间的双射B。说双射是一种误导,因为实际上必须提供反函数。
{ f : fin m → fin n // function.surjective f }从fin m到的猜想类型fin n。此语法从类型构建子类型fin m → fin n,即,从函数类型fin m到fin n。语法为{ var : base type // proposition about var }。
λ m:∀ var, proposition / type involving var实际上是一个函数,它var作为输入,因此λ m介绍输入。∀ m n,是简写∀ m, ∀ n,
nat.rec_on m:对进行递归m。为...定义事物,为m定义事物0,然后为它赋予事物k,为k+1。可能会注意到,这与归纳法相似,并且实际上这是由Church-Howard所致。语法为nat.rec_on var (thing when var is 0) (for all k, given "thing when k is k", build thing when var is "k+1")。
嘿,这是越来越长,我只是在第三行correctness...