Warum werden berechenbare Funktionen auch rekursive Funktionen genannt?

23

In der Berechenbarkeitstheorie werden berechenbare Funktionen auch als rekursive Funktionen bezeichnet. Zumindest auf den ersten Blick haben sie nichts mit dem zu tun, was Sie in der täglichen Programmierung als "rekursiv" bezeichnen (dh Funktionen, die sich selbst aufrufen).

Was ist die eigentliche Bedeutung von rekursiv im Kontext der Berechenbarkeit? Warum heißen diese Funktionen "rekursiv"?

Mit anderen Worten: Was ist der Zusammenhang zwischen den beiden Bedeutungen von "Rekursivität"?

Golo Roden
quelle
2
μ-rekursive Funktion
Thomas Klimpel
3
Sie betrügen, weil sie den μ-Operator enthalten . Dies ist ein Minimierungsoperator, aber natürlich hat Minimierung sehr wenig mit Rekursion zu tun. Es scheint also, als hätte jemand (Kleene) gedacht, dass "rekursiv" schön klingen würde, und er hat eine Entschuldigung für die Verwendung dieses Namens erfunden. Viel später erklärte Robert Soare, dass "berechenbar" viel besser klingen würde und dass "rekursiv" nur ein Marketingtrick der Anfangszeit gewesen war, und alle waren sich einig.
Thomas Klimpel
3
Was ist mit primitiven rekursiven Funktionen? Aus Wikipedia kopiert sind sie definiert als und h ( S ( y ) , x 1 , , x k ) = g ( y , h ( y , x 1 , h(0,x1,,xk)=f(x1,,xk) . Das ist eine Funktion, die sich selbst aufruft. h(S(y),x1,,xk)=g(y,h(y,x1,,xk),x1,,xk)
Hendrik Jan
3
@GoloRoden Beachten Sie, dass die Tag-Beschreibung von 'Berechenbarkeit' (Sie haben sie für diese Frage verwendet) lautet: "Berechenbarkeitstheorie aka Rekursionstheorie". Gödel nannte Funktionen rekursiv , aber der Begriff entwickelte sich zu berechenbar . Vermutlich, um Verwirrungen wie die Ihren zu vermeiden. Menschen, die sich (intensiv) mit Berechenbarkeitstheorie beschäftigen, verwenden den Begriff Rekursionstheorie eher, um seine Wurzeln zu „respektieren“.
Auberon
1
weil sie rekursiv definiert sind, dh " komplexere Funktionen werden in Form von zuvor definierten, einfacheren Funktionen definiert "
Nikos M.

Antworten:

13

Definieren Sie einige Grundfunktionen:

  • Nullfunktion

    zero:NN:x0
  • Nachfolgerfunktion

    succ:NN:xx+1
  • Projektionsfunktion

pin:NnN:(x1,x2,,xn)xi

Von nun an werde ich , um ( x 1 , x 2 , , x n ) zu bezeichnen.xn¯(x1,x2,,xn)

Eine Komposition definieren:

Gegebene Funktionen

  • jeweils mit der Signatur N kNg1,g2,,gmNkN
  • f:NmN

Konstruieren Sie die folgende Funktion:

h:NkN:xk¯h(xk¯)=f(g1(xk¯),g2(xk¯),,gm(xk¯))

Primitive Rekursion definieren:

Gegebene Funktionen

  • f:NkN
  • g:Nk+2N

Konstruiere die folgende (stückweise) Funktion:

h:Nk+1N:(xk¯,y+1){f(xk¯),y+1=0g(xk¯,y,h(xk¯,y)),y+1>0

Alle Funktionen, die unter Verwendung von Kompositionen und primitiver Rekursion auf Basisfunktionen ausgeführt werden können , werden als primitiv rekursiv bezeichnet . Per Definition heißt es so. Es besteht zwar eine Verknüpfung mit Funktionen, die sich selbst aufrufen, es ist jedoch nicht erforderlich, sie miteinander zu verknüpfen. Sie könnten Rekursion als Homonym betrachten.

Diese obige Definition und Konstruktion wurde von Gödel konstruiert (einige andere Personen waren ebenfalls beteiligt), um alle Funktionen zu erfassen, die berechenbar sind, dh es gibt eine Turing-Maschine für diese Funktion. Beachten Sie, dass das Konzept einer Turing-Maschine noch nicht beschrieben wurde oder zumindest sehr vage war.

Zum Glück kam jemand namens Ackermann und definierte die folgende Funktion:

  • Ack:N2N
  • Ack(0,y)=y+1
  • Ack(x+1,0)=Ack(x,1)
  • Ack(x+1,y+1)=Ack(x,Ack(x+1,y))

Diese Funktion ist berechenbar, aber es gibt keine Möglichkeit, sie nur mit den obigen Konstruktionen zu konstruieren! (dh ist nicht primitiv rekursiv) Dies bedeutet, dass Gödel und seine Gruppe nicht alle berechenbaren Funktionen in ihrer Konstruktion erfassen konnten!Ack

Gödel musste seine Klasse von Funktionen erweitern, damit konstruiert werden konnte. Er tat dies, indem er Folgendes definierte:Ack

Grenzenlose Minimierung

  • g:NkN
  • IF [f(xk¯,y)=0 AND f(xk¯,z) is defined z<y AND f(xk¯,z)0]

    g(xk¯)=y

    G(xk¯) ist nicht definiert.

Letzteres mag schwer zu verstehen sein, aber es bedeutet im Grunde genommen, dass G((x1,x2,,xk)) ist die kleinste Wurzel von f (wenn eine Wurzel existiert).


Alle Funktionen, die mit allen oben definierten Konstruktionen erstellt werden können, werden als rekursiv bezeichnet . Auch hier ist der Name rekursiv und muss nicht unbedingt mit Funktionen korrelieren, die sich selbst aufrufen. Betrachten Sie es wirklich als ein Homonym.

Rekursive Funktionen können entweder teilweise rekursive Funktionen oder vollständig rekursive Funktionen sein . Alle partiellen rekursiven Funktionen sind vollständig rekursive Funktionen. Alle primitiven rekursiven Funktionen sind total. Betrachten Sie als Beispiel für eine teilweise rekursive Funktion, die nicht vollständig ist, die Minimierung der Nachfolgerfunktion. Die Nachfolgerfunktion hat keine Wurzeln, daher ist ihre Minimierung nicht definiert. Ein Beispiel für eine vollständig rekursive Funktion (die eine Minimierung verwendet) istEINck.

Jetzt konnte Gödel die bauen EINckfunktionieren auch mit seiner erweiterten Klasse von Funktionen. Tatsächlich kann jede Funktion, die von einer Turingmaschine berechnet werden kann, mit den obigen Konstruktionen dargestellt werden, und umgekehrt kann jede Konstruktion von einer Turingmaschine dargestellt werden.

Wenn Sie neugierig sind, können Sie versuchen, Gödels Klasse zu vergrößern. Sie können versuchen, das Gegenteil von unbegrenzter Minimierung zu definieren. Das heißt, unbegrenzte Maximierung, dh die Funktion, die die größte Wurzel findet. Möglicherweise stellen Sie jedoch fest, dass die Berechnung dieser Funktion schwierig (unmöglich) ist. Sie können in das Problem der ausgelasteten Biber lesen , bei dem versucht wird , eine unbegrenzte Maximierung anzuwenden.

Auberon
quelle
4
I know realise the given definitions don't really answer the question, but my answer describes the evolution of recursion/computability theory, kind of. Might be worth a read.
Auberon
I like it, thanks for your efforts :-)
Golo Roden
In "if h((x1,x2,...,xk),0)=f((x1,x2,...,xk))", I think you mean h((x1,x2,...,xk,0)). Also, there is no then clause prior to the next bullet point's else clause.
Eric Towers
2
Afaik, this is subtly wrong. The set if μ-recursive functions is called the set of partially recursive functions whereas recursive functions are always total. That's why the set of all total functions (resp. languages that can be decided) is called R.
Raphael
1
There are quite a few incorrect statements in your answer. You should not make up history for an answer.
Kaveh
17

The founders of computability theory were mathematicians. They founded what is now called computability theory before there was any computers. What was the way mathematicians defined functions that could be computed? By recursive definitions!

So there were recursive function before there were any other model of computation like Turing machines or lambda calculus or register machines. So people referred to these function as recursive functions. The fact that they turned out to be exactly what Turing machines and other models can compute is a later event (mostly proven by Kleene).

We have the simple definition of a recursive function which is now called primitive recursive function. There were not general enough (e.g. Ackermann's function) so people developed more general notions like μ-recursive functions and Herbrand-Gödel general recursive functions that did capture all computable functions (assuming the Church's thesis). Church claimed that his model of lambda calculus captured all computable functions. Many people, and in particular Gödel, were not convinced that these capture all functions that can be computed. Until Turing's analysis of computation and introduction of his machine model.

The name of the field used to recursion theory. However there has been a successful push in recent decades to change the name to something more appealing from recursion theory to something more computer sciency (vs. mathy). As a result the field is now called computability theory. However if you look at books, papers, conferences, etc. in the early decades they are called recursion theory and not computability theory. Even the title of Soare's own 1987 book (who was the main person behind the push to change the name to computability theory) is "Recursively Enumerable Sets and Degrees".

If you want to know more about the history a fun and good place to read about it is the first chapter of Classical Recursion Theory by Odifreddi.

Kaveh
quelle
7

Robert Soare wrote an essay about this issue. According to him, the term (general) recursive functions was coined by Gödel, who defined them using some sort of mutual recursion. The name stuck, though later on other equivalent definitions were found.

For more information, I recommend Soare's essay.

Yuval Filmus
quelle
0

instead of putting a long comment decided to add an answer:

Because they are defined recursively, i.e "more complex functions are defined in terms of previously defined, simpler functions"

This kind of iterative or incremental procedure creates well-defined functions (in the mathematical sense)

This is the meaning of recursiveness in mathematical parlance. See below how this relates to recursion in programming parlance.

Compare this procedure with techniques and methods like (mathematical) induction which is also an example of recursiveness in mathematics.

Programming has a mathematical vein as well as an engineering one.

This (usualy constructive) procedure is also refered as "bootstrapping" in Operating Systems parlance.

However a runtime recursion of the same function (i.e caling itself during its runtime), since it must (hmm, should) happen on already computed values (or arguments), or in other words, in the part of the result set already computed, is also recursive in the above sense, i.e "defined w.r.t previously defined functions (and their values)"

Else is not well-defined, and leads to such things like Stack Overflow :))))

To give a further example from Operating Systems, a runtime recursion (calling itself) can be taken as the analog of an operating system rebooting after a certain update (e.g core update). Many OSes do the following procedure:

  1. an initial boot to load low-level routines (e.g I/O)
  2. do the necessary updates (using the low-level routines)
  3. re-boot (effectively, re-calling itself), but this time loading the more complex routines (or even the whole system)

Auberon's beautiful answer demonstrates a procedure of this kind in more detail.

Nikos M.
quelle