Çıktı gibi bu tür ifadelerin tam biçimsel puf 1+2=3
, 2+2=2*(1+1)
vb
Introuction
Peano Aritmetiği biliyorsanız, muhtemelen bu bölümü atlayabilirsiniz.
Doğal Sayıları şu şekilde tanımlıyoruz:
(Axiom 1) 0 is a number
(Axiom 2) If `x` is a number, the `S(x)`, the successor of `x`, is a number.
Dolayısıyla, örneğin S(S(S(0)))
bir sayıdır.
Kodunuzdaki herhangi bir eşdeğer temsili kullanabilirsiniz. Örneğin, bunların tümü geçerlidir:
0 "" 0 () !
1 "#" S(0) (()) !'
2 "##" S(S(0)) ((())) !''
3 "###" S(S(S(0))) (((()))) !'''
...
etc
Eklemeyi aşağıdaki gibi tanımlamak için kuralları genişletebiliriz.
(Rule 1) X+0 = X
(Rule 2) X+S(Y)=S(X)+Y
Bu şekilde 2 + 2 = 4'ü şu şekilde kanıtlayabiliriz:
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
Bu kuralları çarpımı şu şekilde tanımlayabiliriz:
(Rule 3) X*0 = 0
(Rule 4) X*S(Y) = (X*Y) + X
Buna izin vermekle birlikte, parantezlerin yapısal rolünü tanımlamamız gerekir.
(Axiom 3) If X is a number, (X) is the same number.
Toplama ve çarpma işleçleri kesinlikle ikilidir ve parantezler her zaman açık olmalıdır. A+B+C
iyi tanımlanmamıştır (A+B)+C
ve A+(B+C)
vardır.
Misal
Şimdi çarpma hakkında bir teorem kanıtlamak için yeterli var: 2 + 2 = 2 * 2
2 + 2
(2) + 2
(0 + 2) + 2
((0*2) + 2) + 2
(1*2) + 2
2*2
Gereksinimler
Bir kanıtıA=B
bir liste ifadeler şekildedir:
- birincisi
A
, - sonuncusu
B
, ve - listedeki her ifade, birinciden ayrı olarak, öncekinden kurallardan biri altında dönüştürülerek elde edilebilir.
Programınız girdi olarak iki geçerli ifade alacaktır , her ifade yukarıda tanımlandığı gibi sayılar, toplama, çarpma ve parantez içerir.
Programınız, böyle bir kanıt varsa, iki ifadenin eşit olduğuna dair bir kanıt, yukarıda tanımlandığı gibi bir liste çıkarır.
İki ifade eşit değilse, programınız hiçbir şey vermez.
Kanıtlama veya çürütme her zaman sonlu sayıda adımda mümkündür, çünkü her ifade tek bir sayıya indirgenebilir ve bu sayılar önemsiz bir şekilde eşitlik açısından test edilebilir.
Giriş ifadeleri geçerli değilse (örn. Dengesiz parantezler, sayı olmayan veya ikili olmayan işleçler içeriyorsa), programınız hatadan çıkmalı, bir istisna atmalı, bir hata yazmalı veya başka bir şekilde gözlemlenebilir davranış üretmelidir . girişlerin geçerli olduğu ancak eşit olmadığı durumlarda .
Özet olarak, kabul edilebilir girdiler için normal çıktı, aşağıdaki kurallar tarafından üretilen girdiler dahil olmak üzere eşit sayıların bir listesidir.
(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.)
Giriş ve çıkış sayıların herhangi bir uygun temsili örneğin, izin verilir 0=""=()
, 3="###"=(((())))
vs Boşluk önemsizdir.
Kurallar elbette her iki yönde de uygulanabilir. Programınızın hangi kuralın kullanıldığını, yalnızca önceki ifade üzerindeki eylemiyle üretilen ifadeyi çıkarması gerekmez.
En kısa kod kazanır.