সংখ্যার তত্ত্বের জন্য দোভাষী, মডুলো এন


12

সংখ্যা তত্ত্বের একটি বাক্য (আমাদের উদ্দেশ্যে) নিম্নলিখিত চিহ্নগুলির ক্রম:

  • 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 + + v2 3 = v3 এর 3 (যা ফের্মার শেষ উপপাদ্য কারণ সত্য হতে হবে, যে এটি পেতে হবে ব্যতীত 0 ^ 3 + 0 ^ 3 = 0 ^ 3 ) ।

দুর্ভাগ্যক্রমে, গডেলের দ্বারা প্রমাণিত হিসাবে, সংখ্যার তত্ত্বের কোনও বাক্য সত্য কিনা তা নির্ধারণ করা সম্ভব নয়।

এটা তোলে হয় যদি আমরা একটি নির্দিষ্ট সেট প্রাকৃতিক সংখ্যার সেট সীমিত সম্ভব, কিন্তু,।

সুতরাং, এই চ্যালেঞ্জটি কিছু ধনাত্মক পূর্ণসংখ্যার জন্য মডুলো গ্রহণের সময় সংখ্যা তত্ত্বের একটি বাক্য সত্য কিনা তা নির্ধারণ করা । উদাহরণস্বরূপ, বাক্যটিnn

forall v0 (v0 * v0 * v0 = v0)

(বিবৃতি যে সমস্ত সংখ্যার জন্য x, x 3 = x)

সাধারণ গাণিতিকের ক্ষেত্রে সত্য নয় (উদাহরণস্বরূপ 2 3 = 8 ≠ 2) তবে মডুলো 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)সংখ্যার তত্ত্বের মডুলো 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)"

ইনপুট স্টিডিন, একটি কমান্ড লাইন আর্গুমেন্ট, একটি ফাইল ইত্যাদি হতে পারে from

বাক্যটি সত্য বা না, এর জন্য প্রোগ্রামের কোনও দুটি স্বতন্ত্র ফলাফল থাকতে পারে, উদাহরণস্বরূপ এটি 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

এটি , তাই আপনার প্রোগ্রামটি যতটা সম্ভব সংক্ষিপ্ত করার চেষ্টা করুন!


1
পরিবর্তনশীল নামগুলি কি সর্বদা বিন্যাসে থাকে v number?
জো কিং

1
তারা @JoKing যদি আপনি তাদের be- করতে আপনি ব্যবহার করতে পারেন var number, অথবা এমনকি মাত্র 1 + number(তাই 1হবে v0, 2হবে v1, ইত্যাদি)
লিও Tenenbaum

1
@ জোকিং আপনার অসীম সংখ্যক ভেরিয়েবলের জন্য (তাত্ত্বিকভাবে) অনুমতি দেওয়া উচিত। সর্বাধিক সংখ্যক ভেরিয়েবলের পূর্ণসংখ্যার সর্বাধিক আকারের সাথে আবদ্ধ থাকলে এটি ঠিক আছে, তবে আপনার এত কম সীমা থাকা উচিত নয়। আপনার যদি সমস্যা হয় তবে আপনি অন্য একটি ইনপুট ফর্ম্যাট বেছে নিতে পারেন।
লিও টেনেনবাম

1
@ আনরলেটেড স্ট্রিং অবশ্যই, এতক্ষণ তারা নির্বিচারে দীর্ঘ হতে পারে।
লিও টেনেনবুম

1
আমরা যদি উপসর্গ-সিনট্যাক্স বিকল্পটি বেছে নিই তবে এর 'v numberপরিবর্তে কেউ কী ব্যবহার করতে পারে v number'?
মিঃ এক্সকোডার

উত্তর:


3

পাইথন 2 , 252 236 বাইট

def g(n,s):
 if str(s)==s:return s.replace("'","+1")
 o,l,r=map(g,[n]*3,s);return['all((%s)for %s in range(%d))'%(r,l,n),'not((%s)*(%s))'%(l,r),'(%s)%%%d==(%s)%%%d'%(l,n,r,n),'(%s)%s(%s)'%(l,o,r)]['fn=+'.find(o)]
print eval(g(*input()))

এটি অনলাইন চেষ্টা করুন!

এর fপরিবর্তে forallএবং nপরিবর্তে নেস্টেড উপসর্গ-বাক্য গঠন হিসাবে ইনপুট নেয় nand:

[3, ["f", "v0", ["=", ["*", "v0", ["*", "v0", "v0"]], "v0"]]]

এখনই এটি পাইথন কোড আউটপুট করছে তবে বাক্যটি সত্য বা মিথ্যা হলে এর দুটি স্বতন্ত্র আউটপুট থাকা উচিত। আপনি ব্যবহার করতে পারেন print(eval(g(*input())))
লিও টেনেনবুম

@ লিওটেনবাউম হ্যাঁ, আমি এটি প্রথম সংস্করণে
পেয়েছি তবে

1

এপিএল (ডায়ালগ ইউনিকোড) , 129 বাইট এসবিসিএস

{x y z3↑⍵⋄7x:y×7<x5x:∧/∇¨y{⍵≡⍺⍺:⍵⍺⋄x y z3↑⍵⋄7x:⍵⋄6x:x(⍺∇y)⋄x(⍺∇⍣(5x)⊢y)(⍺∇z)}∘z¨⍳⍺⍺⋄y←∇y6x:1+yy(⍎x'+×⍲',⊂'0=⍺⍺|-')∇z}

এটি অনলাইন চেষ্টা করুন!

টিফিল্ডের অজগর উত্তরের মতো একটি উপসর্গ সিনট্যাক্স ট্রি নেয় তবে পূর্ণসংখ্যার এনকোডিং ব্যবহার করে। এনকোডিং হয়

plus times nand eq forall succ zero  1 2 3 4 5 6 7

এবং প্রতিটি ভেরিয়েবল 8 থেকে শুরু করে একটি সংখ্যা নির্ধারিত হয় This

টাস্কটিতে কেবলমাত্র দুটি ইনপুট (এএসটি এবং মডিউলো) জড়িত, তবে এটি কোনও ফাংশনের পরিবর্তে অপারেটর হিসাবে লেখা মডিউলটিকে বহুবার উল্লেখ করা এড়ানো যায় না (কারণ এটি সর্বদা পুনরাবৃত্ত কলগুলির দ্বারা বহন করা হয়)।

মন্তব্যে অসম্পূর্ণ

 node types; anything 8 will be considered a var
plus times eq nand forall succ zero var←⍳8
 AST nodes have 1~3 length, 1st being the node type
 zero  zero, succ  succ arg, var  var | var value (respectively)

 to (from replace) AST  transform AST so that 'from' var has the value 'to' attached
replace←{
  ⍵≡⍺⍺:⍵⍺              variable found, attach the value
  x y z3↑⍵
  zerox:             zero or different variable: keep as is
  succx: x(⍺∇y)       succ: propagate to y
  forallx: x y(⍺∇z)   forall: propagate to z
  x(⍺∇y)(⍺∇z)          plus, times, eq, nand: propagate to both args
}
 (mod eval) AST  evaluate AST with the given modulo
eval←{
  x y z3↑⍵
  zerox:   0
  varx:    y                     return attached value
  forallx: ∧/∇¨y replacez¨⍳⍺⍺   check all replacements for given var
  succx:   1+∇y
  plusx:   (∇y)+∇z
  timesx:  (∇y)×∇z
  eqx:     0=⍺⍺|(∇y)-∇z          modulo equality
  nandx:   (∇y)⍲∇z               nand symbol does nand operation
}

এটি অনলাইন চেষ্টা করুন!

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.