精益,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
...