संख्या सिद्धांत का एक वाक्य (हमारे उद्देश्यों के लिए) निम्नलिखित प्रतीकों का एक क्रम है:
0
और'
(उत्तराधिकारी) - उत्तराधिकारी का मतलब है+1
, इसलिए0'''' = 0 + 1 + 1 + 1 + 1 = 4
+
(जोड़) और*
(गुणा)=
(के बराबर)(
और)
(कोष्ठक)- तार्किक ऑपरेटर
nand
(a nand b
हैnot (a and b)
) forall
(यूनिवर्सल क्वांटिफायर)v0
,v1
,v2
, आदि (चर)यहाँ एक वाक्य का उदाहरण दिया गया है:
forall v1 (forall v2 (forall v3 (not (v1*v1*v1 + v2*v2*v2 = v3*v3*v3))))
यहाँ के not x
लिए आशुलिपि है x nand x
- वास्तविक वाक्य का उपयोग होगा (v1*v1*v1 + v2*v2*v2 = v3*v3*v3) nand (v1*v1*v1 + v2*v2*v2 = v3*v3*v3)
, क्योंकि x nand x = not (x and x) = not x
।
यह कहा गया है कि तीन प्राकृतिक संख्या के प्रत्येक संयोजन के लिए v1
, v2
है, और v3
, ऐसा नहीं मामला है कि v1 3 + वी 2 3 = v3 3 (जो फर्मेट के अंतिम प्रमेय की वजह से सही हो सकता है, तथ्य यह है कि यह मिलेगा के अलावा 0 ^ 3 + 0 ^ 3 = 0 ^ 3)।
दुर्भाग्य से, जैसा कि गोडेल ने साबित किया, यह निर्धारित करना संभव नहीं है कि संख्या सिद्धांत में एक वाक्य सच है या नहीं।
यह है कि अगर हम एक परिमित सेट करने के लिए प्राकृतिक संख्याओं के समूह को प्रतिबंधित संभव है, तथापि,।
इसलिए, यह चुनौती यह निर्धारित करने के लिए है कि संख्या सिद्धांत का एक वाक्य सही है या नहीं, जब कुछ सकारात्मक पूर्णांक के लिए modulo लिया जाता है । उदाहरण के लिए, वाक्यn
n
forall v0 (v0 * v0 * v0 = v0)
(कथन जो सभी संख्याओं x, x 3 के लिए है = x)
साधारण अंकगणित के लिए सही नहीं है (उदाहरण 2 3 = 8, 2), लेकिन यह सच है जब लिया गया modulo 3:
0 * 0 * 0 ≡ 0 (mod 3)
1 * 1 * 1 ≡ 1 (mod 3)
2 * 2 * 2 ≡ 8 ≡ 2 (mod 3)
इनपुट और आउटपुट प्रारूप
इनपुट n
किसी भी "उचित" प्रारूप में एक वाक्य और सकारात्मक पूर्णांक है। यहाँ forall v0 (v0 * v0 * v0 = v0)
संख्या सिद्धांत modulo 3 में वाक्य के लिए उचित स्वरूपों के कुछ उदाहरण दिए गए हैं :
("forall v0 (v0 * v0 * v0 = v0)", 3)
"3:forall v0 (((v0 * v0) * v0) = v0)"
"(forall v0)(((v0 * v0) * v0) = v0) mod 3"
[3, "forall", "v0", "(", "(", "(", "v0", "*", "v0", ")", "*", "v0", ")", "=", "v0", ")"]
(3, [8, 9, 5, 5, 5, 9, 3, 9, 6, 3, 9, 6, 4, 9, 6]) (the sentence above, but with each symbol replaced with a unique number)
"f v0 = * * v0 v0 v0 v0"
[3, ["forall", "v0", ["=", ["*", "v0", ["*", "v0", "v0"]], "v0"]]]
"3.v0((v0 * (v0 * v0)) = v0)"
इनपुट स्टडिन, कमांड लाइन तर्क, फ़ाइल आदि से हो सकता है।
इस कार्यक्रम के लिए कोई दो अलग-अलग आउटपुट हो सकते हैं कि वाक्य सही है या नहीं, उदाहरण के लिए यह आउटपुट हो सकता है yes
अगर यह सच है और no
यदि यह नहीं है।
आपको एक चर का समर्थन करने की आवश्यकता नहीं है जो forall
दो बार का विषय है , जैसे (forall v0 (v0 = 0)) nand (forall v0 (v0 = 0))
। आप मान सकते हैं कि आपके इनपुट में सिंटैक्स मान्य है।
परीक्षण के मामलों
forall v0 (v0 * v0 * v0 = v0) mod 3
true
forall v0 (v0 * v0 * v0 = v0) mod 4
false (2 * 2 * 2 = 8 ≡ 0 mod 4)
forall v0 (v0 = 0) mod 1
true (all numbers are 0 modulo 1)
0 = 0 mod 8
true
0''' = 0 mod 3
true
0''' = 0 mod 4
false
forall v0 (v0' = v0') mod 1428374
true
forall v0 (v0 = 0) nand forall v1 (v1 = 0) mod 2
true (this is False nand False, which is true)
forall v0 ((v0 = 0 nand v0 = 0) nand ((forall v1 (v0 * v1 = 0' nand v0 * v1 = 0') nand forall v2 (v0 * v2 = 0' nand v0 * v2 = 0')) nand (forall v3 (v0 * v3 = 0' nand v0 * v3 = 0') nand forall v4 (v0 * v4 = 0' nand v0 * v4 = 0')))) mod 7
true
(equivalent to "forall v0 (v0 =/= 0 implies exists v1 (v0 * v1 = 0)), which states that every number has a multiplicative inverse modulo n, which is only true if n is 1 or prime)
forall v0 ((v0 = 0 nand v0 = 0) nand ((forall v1 (v0 * v1 = 0' nand v0 * v1 = 0') nand forall v2 (v0 * v2 = 0' nand v0 * v2 = 0')) nand (forall v3 (v0 * v3 = 0' nand v0 * v3 = 0') nand forall v4 (v0 * v4 = 0' nand v0 * v4 = 0')))) mod 4
false
ये है कोड गोल्फ, इसलिए अपने कार्यक्रम को यथासंभव छोटा बनाने की कोशिश करें!
var number
, या यहां तक कि बस 1 + number
(इतना 1
ही होगा v0
, 2
होगा v1
, आदि)
'v number
इसके बजाय कोई उपयोग कर सकता है v number'
?
v number
?