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) = 1
yapraklar açmak hangi s(m+1, 0)
ve s(0, n+1)
her ikisi de olduğu tanımlanmıştır, 0
son duruma göre.
Yalın lamdba hesabı sözdizimini kullanır, öyle s m n
de 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. nat
doğal sayı tipidir ve 0
doğal sayı olan ifade olarak ifade edilir 0 : nat
. Biz söylemek 0
tiptedir nat
ve bu nat
vardır 0
bir 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 m
ve 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 A
ve 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 m
iç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 m
için fin n
. Sözdizimi { var : base type // proposition about var }
.
λ m
: ∀ var, proposition / type involving var
gerçekten var
bir girdi olarak alan bir işlevdir , bu yüzden λ m
girdiyi 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 0
ve 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
...