इस तरह के बयानों का एक पूर्ण औपचारिक Poof आउटपुट 1+2=3
, 2+2=2*(1+1)
आदि।
introuction
यदि आप पीनो अंकगणित जानते हैं तो आप शायद इस खंड को छोड़ सकते हैं।
यहां बताया गया है कि हम प्राकृतिक संख्याओं को कैसे परिभाषित करते हैं:
(Axiom 1) 0 is a number
(Axiom 2) If `x` is a number, the `S(x)`, the successor of `x`, is a number.
इसलिए, उदाहरण के S(S(S(0)))
लिए एक संख्या है।
आप अपने कोड में किसी भी समकक्ष प्रतिनिधित्व का उपयोग कर सकते हैं। उदाहरण के लिए, ये सभी मान्य हैं:
0 "" 0 () !
1 "#" S(0) (()) !'
2 "##" S(S(0)) ((())) !''
3 "###" S(S(S(0))) (((()))) !'''
...
etc
हम निम्नानुसार परिभाषित करने के लिए नियमों का विस्तार कर सकते हैं।
(Rule 1) X+0 = X
(Rule 2) X+S(Y)=S(X)+Y
इसके साथ हम 2 + 2 = 4 को निम्नानुसार साबित कर सकते हैं
S(S(0)) + S(S(0)) = 2 + 2
[Rule 2 with X=S(S(0)), Y=S(0)]
S(S(S(0))) + S(0) = 3 + 1
[Rule 2 with X=S(S(S(0))), Y=0]
S(S(S(S(0)))) + 0 = 4 + 0
[Rule 1 with X=S(S(S(S(0))))
S(S(S(S(0)))) = 4
निम्नानुसार गुणा को परिभाषित करने के लिए हम इन नियमों का विस्तार कर सकते हैं
(Rule 3) X*0 = 0
(Rule 4) X*S(Y) = (X*Y) + X
यद्यपि इसे अनुमति देने के लिए हमें कोष्ठक की संरचनात्मक भूमिका को परिभाषित करने की आवश्यकता है।
(Axiom 3) If X is a number, (X) is the same number.
जोड़ और गुणा संचालक सख्ती से बाइनरी हैं और कोष्ठक हमेशा स्पष्ट होना चाहिए। A+B+C
अच्छी तरह से परिभाषित नहीं है, लेकिन (A+B)+C
और A+(B+C)
हैं।
उदाहरण
अब हमारे पास गुणन के बारे में एक प्रमेय साबित करने के लिए पर्याप्त है: 2 + 2 = 2 * 2
2 + 2
(2) + 2
(0 + 2) + 2
((0*2) + 2) + 2
(1*2) + 2
2*2
आवश्यकताएँ
एक सबूत है किA=B
एक सूची भाव इस तरह है:
- पहला है
A
, - अंतिम है
B
, और - पहले के अलावा सूची में प्रत्येक अभिव्यक्ति पिछले से एक नियम के तहत इसे परिवर्तित करके प्राप्त की जा सकती है।
आपका कार्यक्रम इनपुट के रूप में दो मान्य अभिव्यक्तियाँ लेगा , प्रत्येक अभिव्यक्ति में संख्याएँ, जोड़, गुणन और कोष्ठक हैं जैसा कि ऊपर परिभाषित किया गया है।
आपका कार्यक्रम एक प्रमाण आउटपुट करेगा, जैसा कि ऊपर परिभाषित एक सूची है, कि दो अभिव्यक्तियाँ समान हैं, यदि ऐसा कोई प्रमाण मौजूद है।
यदि दो अभिव्यक्तियाँ समान नहीं हैं, तो आपका प्रोग्राम कुछ भी नहीं करेगा।
एक निश्चित संख्या में चरणों में साबित करना या काटना हमेशा संभव होता है, क्योंकि प्रत्येक अभिव्यक्ति को एक ही संख्या में घटाया जा सकता है और इन संख्याओं को समानता के लिए तुच्छ रूप से परखा जा सकता है।
यदि इनपुट अभिव्यक्तियाँ मान्य नहीं हैं (जैसे असंतुलित कोष्ठक, जिसमें गैर-संख्याएँ, या गैर-बाइनरी ऑपरेटर शामिल हैं) तो आपका कार्यक्रम त्रुटि से बाहर निकलना चाहिए, एक अपवाद फेंकना, एक त्रुटि प्रिंट करना, या अन्यथा कुछ अवलोकन योग्य व्यवहार उत्पन्न करना जो कि भिन्न से भिन्न हो ऐसा मामला जिसमें इनपुट मान्य हों लेकिन गैर-बराबर हों ।
सारांश में, स्वीकार्य इनपुट के लिए सामान्य आउटपुट इनपुट सहित समान संख्याओं की एक सूची है, जो निम्नलिखित नियमों द्वारा निर्मित है।
(Axiom 1) 0 is a number
(Axiom 2) If `x` is a number, the `S(x)`, the successor of `x`, is a number.
(Axiom 3) If X is a number, (X) is the same number
(Rule 1) X+0 = X
(Rule 2) X+S(Y)=S(X)+Y
(Rule 3) X*0 = 0
(Rule 4) X*S(Y) = (X*Y) + X
(Rule 5) X = (X) (Axiom 3 expressed as a transformation rule.)
इनपुट और आउटपुट में संख्या का कोई भी उपयुक्त प्रतिनिधित्व, अनुमति दी है जैसे 0=""=()
, 3="###"=(((())))
आदि व्हाइटस्पेस अप्रासंगिक है।
बेशक, नियम किसी भी दिशा में लागू किए जा सकते हैं। आपके प्रोग्राम को आउटपुट नहीं करना है जो नियम का उपयोग किया जाता है, बस पिछले एक्सप्रेशन पर इसके एक्शन द्वारा निर्मित एक्सप्रेशन।
सबसे छोटा कोड जीतता है।