Bu cevap , numaralandırmanın neden doğru olduğunu anlamakta biraz zor olabileceğiniz TheNumberOne , Enumerate geçerli Brainf ** k programlarının cevabının resmi bir kanıtıdır . Neden geçerli bir program tarafından kapsanmayan bir numaraya eşlenen bazı geçersiz programların olmadığını anlamak önemsizdir.
Bu cevap boyunca büyük harf, programları belirtmek için kullanılır ve küçük harf değişkenleri işlevler ve tam sayılar için kullanılır. ~ birleştirme işlecidir.
Teklif 1:
F işlevi bu cevapta açıklanan program olsun. Sonra her U programı için, f (U) = f (V) olacak şekilde geçerli bir V programı vardır.
1. Tanım:
G (X) ' [
in X programında göründüğü sayı olmasını ve h (X)' un ]
göründüğü sayı olmasını sağlayın .
Tanım 2:
Bu fonksiyon olarak P (x) tanımlayın:
P(x) = "" (the empty program) when x <= 0
P(x) = "]" when x = 1
P(x) = "]]" when x = 2
etcetera
Tanım 3:
X programına bakıldığında, X1'in en büyük [
karakter öneki , X2'nin merkezi ve X3'ün en büyük ]
karakter sonekini olduğunu belirtin .
Teklif 1'in kanıtı:
Eğer g (U) = h (U) ise U geçerli bir programdır ve V = U alabiliriz. (önemsiz dava).
Eğer g (U) <h (U) ise n = h (U) - g (U) [
sembollerini hazırlayarak V oluşturabiliriz . Açıkçası f (V) = f (U) [
önek içindeki tüm semboller kaldırıldı.
Şimdi g (U)> h (U) olarak düşünün. T = U2 ~ U3'ü tanımlayın. g (T) <= h (T) ise, n = g (U) - h (U) [
sembollerini kaldırarak V oluşturabiliriz .
Öyleyse, h (T) <g (T) olduğunu varsayabiliriz. Yapı V = T ~ P (g (T) - h (T)).
Devam etmek için üç küçük gerçeğe ihtiyacımız var:
İstem 1: g (U2) = g (T)
U3 [
tanımı gereği hiçbir sembol içermez . T = U2 ~ U3 olarak, [
sembollerin tümü ilk bölümdedir.
2. İstem 2: s (U3) <g (T)
Bu, h (T) <g (T) ve h (U3) <h (U3 ~ U2) = h (T) olduğuna dikkat çekmektedir.
İstem 3: h (V3) = g (U2) - h (U2)
h(V3) = h(U3) + g(T) - h(T) using the construction of V
h(V3) = h(U3) + g(U2) + g(U3) - h(U2) - h(U3) apply the definition of T
h(V3) = g(U2) - h(U2) *one term cancels, g(U3) is always zero, as U3 contains only `]` symbols*
Şimdi f (V) = f (U) olduğunu gösterelim.
f(U) = U2 ~ P(h(U3) - g(U2)) = U2 claim 2, definition of P
f(V) = U2 ~ P(h(V3) - g(V2))
= U2 ~ P(h(V3) - g(U2))
= U2 ~ P(g(U2) - h(U2) - g(U2)) claim 3
= U2 ~ P(-h(U2))
= U2 definition P
Bu ispat tamamlar. QED
Benzersizliği de yapalım.
Teklif 2:
U, V iki farklı, geçerli programlar olsun. Sonra f (U)! = F (V)
Bu, önceki önermeye kıyasla oldukça basittir.
Diyelim ki U2 = V2. Ancak, U ve V'nin farklı olabilmesinin tek yolu, sırasıyla U1 ve U3'e n [
ve ]
sembollerin eklenmesi veya çıkarılmasıdır . Ancak bu f'nin çıktısını değiştirir, çünkü f ]
, son ekdeki eşleşmemiş sembollerin sayısını sayar .
Böylece U2! = V2.
Açıkçası, bu bir çelişkiye yol açar. U2 ve V2, sırasıyla f (U) ve f (V) 'nin çıkışında yer aldığından,' kenar 'dışında, U2'nin U3 ile birleştirildiği yer dışında farklılık gösteremezler. Ancak U2 ve V2'nin ilk ve son sembolleri sırasıyla [
veya ]
tanımda olamaz , oysa sırasıyla U1, U3, V1, V3'te izin verilen tek semboller bunlar. Böylece U2 = V2 olur. QED