린 , 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]
과에서 surjections [0 ... m-1]
위에 [0 ... n-1]
.
두 번째는 일반적으로 언급되는 방식 s(m, n)
입니다. 즉,[0 ... m-1]
방식 [0 ... n-1]
입니다.
린 (Lean)은 유형 이론을 기반 이론 대신에 기초로 사용합니다. 유형 이론에서 모든 객체에는 고유 한 유형이 있습니다. nat
자연수의 유형이고 자연수 인 문장 0
은로 표현됩니다 0 : nat
. 우리는 그것이 0
유형 이라고 말합니다nat
, 그것은 nat
이 0
거민한다.
건의안 (명명 서 / 어설 션)도 유형입니다. 주민은 제안서의 증거입니다.
def
: 우리는 정의를 소개하려고합니다 (투사는 실제로 명제 만이 아니라 함수이기 때문입니다).
correctness
: 정의의 이름
∀ m n
: m
and and n
(Lean은 nat
다음 유형으로 인해 유형이 자동으로 추론 됩니다).
fin (s m n)
보다 작은 자연수의 유형입니다 s m n
. 주민을 만들기 위해 자연수와보다 작은 증거를 제공합니다 s m n
.
A ≃ B
: 유형 A
과 유형 사이의 bijection B
. 실제로 역함수를 제공해야하므로 bijection을 말하는 것은 잘못된 것입니다.
{ 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
. 이것은 이것이 유도와 유사하다는 것을 알았을 것입니다. 그리고 이것은 실제로 교회 하워드 통신 의 결과입니다 . 문법은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")
입니다.
Heh, 이것은 점점 길어지고 있으며 나는 세 번째 줄에만 있습니다 correctness
...