झुक , 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को अंतिम मामले से परिभाषित किया जाता है।
लीन लैम्ब्डा कैलकुलस सिंटैक्स का उपयोग करता है, इसलिए 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 }से surjections के प्रकार 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")।
हे, यह लंबा हो रहा है और मैं केवल तीसरी पंक्ति पर हूं correctness...