झुक , 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
...