(私たちの目的のための)数論の文は、次の記号のシーケンスです。
0
および'
(後継者)-後継者は+1
、0'''' = 0 + 1 + 1 + 1 + 1 = 4
+
(加算)と*
(乗算)=
(に等しい)(
と)
(括弧)- 論理演算子
nand
(a nand b
isnot (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
です。
3つの自然数の組み合わせ毎に、この状態v1
、v2
およびv3
、それがV1とは限らない3 + v2の3 = v3の3は(それはなるだろうという事実を除き、理由フェルマーの最終定理の真のだろうどの0 ^ 3 + 0 ^ 3 = 0 ^ 3)。
残念ながら、ゲーデルによって証明されたように、数論の文章が真実であるかどうかを判断することは不可能です。
ただし、自然数のセットを有限セットに制限することは可能です。
したがって、この課題は、いくつかの正の整数に対して、モジュロ n
で解釈したときに、数論の文が真であるかどうかを判断することn
です。たとえば、文
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)"
入力は、stdin、コマンドライン引数、ファイルなどから取得できます。
プログラムは、文が真であるかどうかについて2つの異なる出力を持つことができます。たとえば、yes
真であるno
場合とそうでない場合で出力することができます。
forall
たとえば、のように、1つの変数が2回の対象になることをサポートする必要はありません(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
これはcode-golfなので、プログラムをできるだけ短くしてください!
var number
- あなたは使うことができます、あるいはそれだけでも1 + number
(そう1
なるでしょうv0
、2
そうなるでしょうv1
)
'v number
代わりに使用できv number'
ますか?
v number
ですか?