Câu trả lời này là bằng chứng chính thức cho câu trả lời của TheNumberOne , liệt kê các chương trình Brainf ** k hợp lệ , trong đó có thể hơi khó hiểu các điểm tốt tại sao phép liệt kê là chính xác. Không cần thiết để hiểu tại sao không có một chương trình không hợp lệ nào ánh xạ tới một số không được bao phủ bởi một chương trình hợp lệ.
Trong suốt câu trả lời này, thủ đô được sử dụng để biểu thị các chương trình và các biến chữ thường được sử dụng cho các hàm và số nguyên. ~ là toán tử ghép.
Dự luật 1:
Đặt hàm f là chương trình được mô tả trong câu trả lời đó. Sau đó, với mỗi chương trình U tồn tại một chương trình V hợp lệ sao cho f (U) = f (V)
Định nghĩa 1:
Đặt g (X) là số [
xuất hiện trong chương trình X và gọi h (X) là số ]
xuất hiện.
Định nghĩa 2:
Xác định P (x) là hàm này:
P(x) = "" (the empty program) when x <= 0
P(x) = "]" when x = 1
P(x) = "]]" when x = 2
etcetera
Định nghĩa 3:
Cho một chương trình X, biểu thị X1 là tiền tố lớn nhất của các [
ký tự, X2 là trung tâm của nó và X3 là hậu tố lớn nhất của các ]
ký tự.
Bằng chứng về mệnh đề 1:
Nếu g (U) = h (U) thì U là chương trình hợp lệ và chúng ta có thể lấy V = U. (trường hợp tầm thường).
Nếu g (U) <h (U) thì chúng ta có thể tạo V bằng cách thêm các ký hiệu n = h (U) - g (U) [
. Rõ ràng f (V) = f (U) khi tất cả các [
ký hiệu trong tiền tố được loại bỏ.
Bây giờ hãy xem xét g (U)> h (U). Xác định T = U2 ~ U3. nếu g (T) <= h (T), thì chúng ta có thể xây dựng V bằng cách loại bỏ các ký hiệu n = g (U) - h (U) [
.
Vì vậy, chúng ta có thể giả sử rằng h (T) <g (T). Xây dựng V = T ~ P (g (T) - h (T)).
Chúng tôi cần ba sự thật nhỏ để tiến hành:
Yêu cầu 1: g (U2) = g (T)
U3 không chứa bất kỳ [
ký hiệu nào theo định nghĩa của nó. Vì T = U2 ~ U3, các [
ký hiệu của nó đều nằm trong phần đầu tiên.
Yêu cầu 2: h (U3) <g (T)
Điều này xuất phát từ việc lưu ý rằng h (T) <g (T) và h (U3) <h (U3 ~ U2) = h (T).
Yêu cầu 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*
Bây giờ chúng tôi chỉ ra rằng f (V) = f (U).
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
Điều này hoàn thành bằng chứng. QED
Chúng ta hãy làm duy nhất là tốt.
Dự luật 2:
Đặt U, V là hai chương trình khác nhau, hợp lệ. Sau đó f (U)! = F (V)
Điều này khá đơn giản so với các đề xuất trước đây.
Giả sử rằng U2 = V2. Nhưng sau đó, cách duy nhất U và V có thể khác nhau là bằng cách thêm hoặc xóa n [
và ]
ký hiệu tương ứng với U1 và U3. Tuy nhiên, điều này thay đổi đầu ra của f, vì f sẽ đếm số lượng các ]
ký hiệu chưa từng có trong hậu tố.
Do đó U2! = V2.
Rõ ràng, điều này dẫn đến một mâu thuẫn. Vì U2 và V2 được chứa theo nghĩa đen trong đầu ra của f (U) và f (V), chúng không thể khác nhau, ngoại trừ ở 'cạnh', nơi U2 được nối với U3. Nhưng các ký hiệu đầu tiên và cuối cùng của U2 và V2 không thể [
hoặc ]
theo định nghĩa, trong khi đó là các ký hiệu duy nhất được phép trong U1, U3, V1, V3 tương ứng và một lần nữa. Do đó ta được U2 = V2. QED