লিন , 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
এর মধ্যে একটি bijection: প্রথম এক কি সত্যিই ঘটছে হয় [0 ... s(m, n)-1]
এবং থেকে surjections [0 ... m-1]
সম্মুখের[0 ... n-1]
।
দ্বিতীয় কিভাবে এটি সাধারণত বলা, যে হয় s(m, n)
থেকে surjections এর cardinality হয় [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
...