Fungsi rekursif primitif dan fungsi Ackerman

Fungsi Ackerman adalah salah satu fitur paling terkenal dalam Ilmu Komputer. Ini dikaitkan dengan setidaknya satu hasil mendasar dan setidaknya satu hasil yang cukup penting. Hasil mendasar, untuk membuatnya lebih rapi dan tidak dapat dipahami, adalah sebagai berikut: ada fungsi komputasi yang didefinisikan di mana-mana yang tidak bersifat rekursif primitif. Hasil penting adalah bahwa hutan set disjoint (juga dikenal sebagai persatuan set disjoint) sangat cepat .


Saya sangat suka mempelajari fungsi Ackerman, sebagai semuanya terhubung dengan itu sangat indah dan elegan. Jadi hasil fundamental yang dicatat di atas jauh lebih mudah dipahami daripada yang terlihat.


Dari teks di bawah ini Anda akan mempelajari apa fungsi rekursif primitif dan bagaimana mengetahui bahwa fungsi Akkerman tidak berlaku untuk mereka. Dan, tentu saja, teks ini akan meyakinkan Anda bahwa itu adalah desain yang sangat indah dan alasan yang sangat indah!


1. Mengapa ini mungkin menarik


Diskusi tentang hubungan antara fungsi rekursif primitif dan fungsi Ackerman adalah contoh pemecahan masalah standar dalam teori komputabilitas: model perhitungan tertentu, fungsi tertentu diberikan, dan perlu untuk menentukan apakah fungsi ini dapat dihitung dalam model ini.


Contoh serupa lainnya dikaitkan, misalnya, dengan decidability algoritmik , kesetaraan berbagai model komputasi (mesin Turing, fungsi rekursif parsial, algoritma Markov normal, dan sebagainya). Dan melalui mereka kita sudah terhubung dengan area definisi praktis untuk kelengkapan Turing bahasa pemrograman, transformasi setara teks program dan hal-hal menarik lainnya.


Fungsi Ackerman tampaknya telah diciptakan secara khusus untuk menjadi contoh yang elegan untuk memecahkan masalah tersebut. Anda akan segera melihatnya.


2. Fungsi Ackerman


, Β« Β». , , , .


a0,a1,...,an,.... :


a0(x)=x+1


ai+1(x)=ai[x+2](x)


f[n](x)=f(f(...(f(x))...))β€” n, n. , : , x+2xβ€” x.


, β€” , .


:


def Foo(number, argument):
    if number == 0:
        return argument + 1

    result = argument
    for i in range(argument + 2):
        result = Foo(number - 1, result)

    return result

ai(x)Foo(i, x).


. -, : ai(x)>xix. , , a0(x)=x+1>x, a0.


-, : ai+1(x)>ai(x)ix. , β€” , . :


ai+1(x)=ai[x+2](x)β‰₯ai[2](x)=ai(ai(x))>ai(x)


,


ai+1(x)β‰₯ai(ai(x))


3. - ()


Β« Β». β€” . : , , , .


- ? «». - :


  1. , : Null(x1,x2,...,xk)=0
  2. : S(x)=x+1
  3. -: Pki(x1,x2,...,xk)=xi

. Β« Β»:


  • . fβ€” k, g1,g2,...,gkβ€” n, nF: n, kg1,...,gk, f. !

F(x1,...,xn)=f(g1(x1,...,xn),...,gk(x1,...,xn))


  • . fβ€” k, gβ€” k+2, , :

F(x1,...,xk,0)=f(x1,...,xk)


F(x1,...,xk,y+1)=g(x1,...,xk,y,F(x1,...,xk,y))


, . : , . : , , . , .. , .


, β€” , , .


.


, . , . , :


Sum(x,0)=P11(x)


Sum(x,y+1)=S(P33(x,y,Sum(x,y)))


β€” , . , . Sum(x,0)=x, , .. x. P11. , : x,y,Sum(x,y). , P33, .


:


Mult(x,0)=Null(x)


Mult(x,y+1)=Sum(P31(x,y,Mult(x,y)),P33(x,y,Mult(x,y)))


- . , ! , :


Fib0=0
Fib1=1
Fibn+2=Fibn+Fibn+1


, ; , !


, . , F, . , G, , :


F(n)=Fibn
G(n)=Fibn+1


F0, 1, 1, 2, 3, 5; G, , 1, 1, 2, 3, 5, 8. :
G(n+1)=G(n)+F(n)
F(n+1)=G(n)


:


F(0)=Null()


G(0)=S(Null())


F(y+1)=P21(G(y),F(y))


G(y+1)=Sum(F(y),G(y))


:


def G(x):
    if x == 0:
        return 1
    return G(x - 1) + F(x - 1)

def F(x):
    if x == 0:
        return 0
    return G(x - 1)

, , , , n- - !


4. ,


, - Β« Β» . : - kfn, :


f(x1,...,xk)<an(max(x1,...,xk))


β€” . , , .


, :


Null(x1,...,xk)=0<max(x1,...,xk)+1=a0(max(x1,...,xk))


S(x)=x+1=a0(x)<a1(x)


Pki(x1,...,xk)=xi≀max(x1,...,xk)<a0(max(x1,...,xk))


, , a0(: , , ). β€” a0, a1. - , , , .


. : , , , , .


Ff,g1,...,gk, aM. , F. :


F(x1,...,xn)=f(g1(x1,...,xn),...,gk(x1,...,xn))<


<aM(max(g1(x1,...,xn),...,gk(x1,...,xn)))<


<aM[max(aM(max(x1,...,xn)),...,aM(max(x1,...,xn)))]


<aM(aM(max(x1,...,xn)))≀aM+1(max(x1,...,xn))


f, gi, k, . aM, aM+1.


Ffg, aM.


, , . : f:


F(x1,...,xk,0)=f(x1,...,xk)<aM(max(x1,...,xk))


, , :


F(x1,...,xk,1)=g(x1,...,xk,0,F(x1,...,xk,0))<


<aM(max(x1,...,xk,0,aM(max(x1,...,xk)))<


<aM(aM(max(x1,...,xk))=aM[2](max(x1,...,xk))


F, g. aM: ,


aM(max(x1,...,xk))>max(x1,...,xk,0)


, ,


F(x1,...,xk,y)<aM[y+1](max(x1,...,xk))


Dan properti dari urutan fungsi yang diperkenalkan menjamin hal itu


aM[y+1](max(x1,...,xk))<aM+1(max(x1,...,xk,y))


Akhirnya:


F(x1,...,xk,y)<aM+1(max(x1,...,xk,y))


Dan di sinilah bukti kita selesai. Sangat lucu bahwa ternyata setiap aplikasi komposisi atau rekursi primitif meningkatkan jumlah fungsi yang diperlukan oleh kondisi pernyataan oleh satu.


5. Fungsi Ackerman dan PRF, bagian dua


Jadi, kita tahu bahwa untuk fungsi rekursif primitif ada fungsi aMyang akan tumbuh lebih cepat. Sekarang Anda dapat mendefinisikan fungsi berikut:


A(n)=an(n)


Bahkan, dengan memperkenalkan urutan fungsi dari satu argumen, kami memperkenalkan fungsi dari dua argumen: yang pertama menetapkan nomor fungsi dalam urutan, yang kedua - argumen itu sendiri. Menyamakan angka dan argumen, kita mendapatkan fungsi dari satu argumen.


: A-.


, , -. 4 M, A(x)<aM(x)x. , :


A(M+1)=aM+1(M+1)>aM(M+1)


, -. - , ! .


6. ?


, , - , . , . nn. Apalagi fungsi dari bentuk apa pun


nn...nn


dengan jumlah eksponen yang telah ditentukan, bersifat primitif rekursif. Saya tidak akan malas dan membuktikannya. Untuk memulai, saya akan membangun sebuah fungsiny:


Pow(n,0)=S(Null())


Pow(n,y+1)=Mult(P31(n,y,Pow(n,y)),P33(n,y,Pow(n,y)))


Sekarang saya menggunakannya untuk mendefinisikan suatu fungsi nn:


SPow(n)=Pow(P11(n),P11(n))


Seperti yang Anda lihat, ini dilakukan dengan substitusi sederhana. Sekarang tidak ada kesulitan dalam mendefinisikan suatu fungsinnn:


SSPow(n)=Pow(P11(n),SPow(n))


Dengan analogi, kita dapat membangun suatu fungsi di mana ndiangkat ke kekuasaan nlima kali, sepuluh kali, seratus kali, sejuta kali. Fungsi Ackerman tumbuh lebih cepat daripada fungsi-fungsi ini. Begitulah cepatnya pertumbuhannya!

Source: https://habr.com/ru/post/undefined/


All Articles