def s:_->nat->nat|(m+1)(n+1):=(n+1)*(s m n+s m(n+1))|0 0:=1|_ _:=0
Çevrimiçi deneyin!
Doğruluk kanıtı
Çevrimiçi deneyin!
açıklama
Fonksiyonu çözelim:
def s : nat->nat->nat
| (m+1) (n+1) := (n+1)*(s m n + s m (n+1))
| 0 0 := 1
| _ _ := 0
İşlev, her ikisi de yerleşik desteğe sahip desen eşleştirme ve özyineleme ile tanımlanır.
Biz tanımlamak s(m+1, n+1) = (n+1) * (s(m, n) + s(m, n+1)ve s(0, 0) = 1yapraklar açmak hangi s(m+1, 0)ve s(0, n+1)her ikisi de olduğu tanımlanmıştır, 0son duruma göre.
Yalın lamdba hesabı sözdizimini kullanır, öyle s m nde s(m, n).
Şimdi, doğruluk kanıtı: Bunu iki şekilde ifade ettim:
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
Birincisi gerçekten olup biten şeydir: arasında bir ayrım [0 ... s(m, n)-1]ve onun [0 ... m-1]üzerinden gelen enjeksiyonlar [0 ... n-1].
İkincisi genellikle, belirtilmektedir nasıl s(m, n)gelen surjections kardinalitesi olduğu [0 ... m-1]üzerine [0 ... n-1].
Yalın tip teorisini temel olarak kullanır (küme teorisi yerine). Tür teorisinde, her nesnenin kendine özgü bir türü vardır. natdoğal sayı tipidir ve 0doğal sayı olan ifade olarak ifade edilir 0 : nat. Biz söylemek 0tiptedir natve bu natvardır 0bir sakini olarak.
Öneriler (ifadeler / iddialar) da türlerdir: sakinleri teklifin bir kanıtıdır.
def: Bir tanım sunacağız (çünkü bir teklif sadece bir öneri değil, gerçek bir işlevdir).
correctness: tanımın adı
∀ m n: Her için mve n(kendi türü olduğunu otomatik olarak infers Lean natçünkü şu ne,).
fin (s m n)daha küçük olan doğal sayıların türüdür s m n. Bir sakin yapmak için, kişi doğal bir sayı ve daha küçük olduğuna dair bir kanıt sağlar s m n.
A ≃ B: tip Ave tip arasında birleşme B. Bijection demek yanıltıcıdır, çünkü gerçekte ters fonksiyon sağlamak zorundadır.
{ f : fin m → fin n // function.surjective f }den surjections türü fin miçin fin n. Bu sözdizimi türünden bir alt türü oluşturur fin m → fin n, gelen işlevlerin türünü yani fin miçin fin n. Sözdizimi { var : base type // proposition about var }.
λ m: ∀ var, proposition / type involving vargerçekten varbir girdi olarak alan bir işlevdir , bu yüzden λ mgirdiyi tanıtır. ∀ m n,için kısa el∀ m, ∀ n,
nat.rec_on m: özyineleme yapmak m. Bir şeyi tanımlamak için m, şeyi tanımlayın 0ve sonra için bir şey verin k, şeyi oluşturun k+1. Bunun indüksiyonla benzer olduğunu ve aslında bunun Church-Howard yazışmasının bir sonucu olduğunu fark eder . Sözdizimi 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, bu uzun sürüyor ve ben sadece üçüncü satırındayım correctness...