Sayı teorisinin bir cümlesi (bizim için) aşağıdaki sembollerin bir dizisidir:
0
ve'
(halef) - halef+1
,0'''' = 0 + 1 + 1 + 1 + 1 = 4
+
(toplama) ve*
(çarpma)=
(eşittir)(
ve)
(parantez)- mantıksal işleç
nand
(a nand b
isnot (a and b)
) forall
(evrensel nicelik belirteci)v0
,v1
,v2
, Vb (değişkenler)İşte bir cümle örneği:
forall v1 (forall v2 (forall v3 (not (v1*v1*v1 + v2*v2*v2 = v3*v3*v3))))
İşte not x
kısaca x nand x
- gerçek cümle kullanılır (v1*v1*v1 + v2*v2*v2 = v3*v3*v3) nand (v1*v1*v1 + v2*v2*v2 = v3*v3*v3)
çünkü x nand x = not (x and x) = not x
.
Bu, üç doğal sayının her kombinasyonu için v1
, v2
ve v3
bu v1 durum böyle değildir 3 + v2 3 = v3 3 (o alacağı gerçeği dışında, çünkü Fermat'ın Son Teoremi gerçek olacağını 0 ^ 3 +0 ^ 3 = 0 ^ 3).
Ne yazık ki, Gödel tarafından kanıtlandığı gibi, sayı teorisinde bir cümlenin doğru olup olmadığını belirlemek mümkün değildir.
Bu ise bir sonlu kümesine doğal sayılar kümesi kısıtlamak eğer, ancak, mümkün.
Bu nedenle, bu zorluk, sayı teorisinin bir cümlesinin, alındığında doğru olup olmadığını belirlemektir. modulo n
, bazı pozitif tamsayı içinn
. Örneğin, cümle
forall v0 (v0 * v0 * v0 = v0)
(x, x 3 = x tüm sayıları için ifade )
Sıradan aritmetik için doğru değildir (ör. 2 3 = 8 ≠ 2), ancak bir modulo 3 alındığında doğru:
0 * 0 * 0 ≡ 0 (mod 3)
1 * 1 * 1 ≡ 1 (mod 3)
2 * 2 * 2 ≡ 8 ≡ 2 (mod 3)
Giriş ve çıkış formatı
Giriş, n
herhangi bir "makul" formatta bir cümle ve pozitif tamsayıdır . İşte cümle için makul biçimlere bazı örneklerforall v0 (v0 * v0 * v0 = v0)
Sayı teorisi modulo 3'teki :
("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)"
Giriş stdin, bir komut satırı bağımsız değişkeni, bir dosya vb. Olabilir.
Program, cümlenin doğru olup olmadığı konusunda iki farklı çıktıya sahip olabilir, örneğin çıktı verebilir yes
doğru veno
.
Bir değişkenin konu olan bir değişkenini desteklemenize gerek yoktur. forall
İki , örn (forall v0 (v0 = 0)) nand (forall v0 (v0 = 0))
. Girişinizin geçerli bir sözdizimi olduğunu varsayabilirsiniz.
Test senaryoları
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
Bu kod golf, programınızı mümkün olduğunca kısa yapmaya çalışın!
var number
, hatta sadece 1 + number
(bu yüzden 1
olacağını v0
, 2
olurdu v1
, vs.)
'v number
yerine v number'
biz önek sözdizimi seçeneği olur?
v number
mi?