En matemáticas y ciencias de la computación , se utiliza una definición recursiva o definición inductiva para definir los elementos de un conjunto en términos de otros elementos del conjunto ( Aczel 1977:740ff). Algunos ejemplos de objetos definibles de forma recursiva incluyen factoriales , números naturales , números de Fibonacci y el conjunto ternario de Cantor .
Una definición recursiva de una función define los valores de la función para algunas entradas en términos de los valores de la misma función para otras entradas (normalmente más pequeñas). Por ejemplo, la función factorial n ! se define mediante las reglas
Esta definición es válida para cada número natural n , porque la recursión finalmente alcanza el caso base de 0. La definición también puede considerarse como un procedimiento para calcular el valor de la función n !, comenzando desde n = 0 y continuando con n = 1, 2, 3, etc.
El teorema de recursión establece que tal definición define una función que es única. La prueba utiliza la inducción matemática . [1]
Una definición inductiva de un conjunto describe los elementos de un conjunto en términos de otros elementos del conjunto. Por ejemplo, una definición del conjunto de números naturales es :
Hay muchos conjuntos que satisfacen (1) y (2); por ejemplo, el conjunto {1, 1,649, 2, 2,649, 3, 3,649, …} satisface la definición. Sin embargo, la condición (3) especifica el conjunto de números naturales eliminando los conjuntos con miembros extraños.
Las propiedades de funciones y conjuntos definidos recursivamente pueden demostrarse a menudo mediante un principio de inducción que sigue la definición recursiva. Por ejemplo, la definición de los números naturales presentada aquí implica directamente el principio de inducción matemática para los números naturales: si una propiedad se cumple para el número natural 0 (o 1), y la propiedad se cumple para n + 1 siempre que se cumpla para n , entonces la propiedad se cumple para todos los números naturales (Aczel 1977:742).
La mayoría de las definiciones recursivas tienen dos fundamentos: un caso base y una cláusula inductiva.
La diferencia entre una definición circular y una definición recursiva es que una definición recursiva siempre debe tener casos base , casos que satisfacen la definición sin estar definidos en términos de la definición misma, y que todas las demás instancias en las cláusulas inductivas deben ser "más pequeñas" en algún sentido (es decir, más cercanas a aquellos casos base que terminan la recursión), una regla también conocida como "recurrir solo con un caso más simple". [2]
Por el contrario, una definición circular puede no tener un caso base e incluso puede definir el valor de una función en términos de ese valor en sí mismo, en lugar de otros valores de la función. Una situación de este tipo conduciría a una regresión infinita .
Que las definiciones recursivas son válidas –lo que significa que una definición recursiva identifica una función única– es un teorema de la teoría de conjuntos conocido como el teorema de recursión , cuya prueba no es trivial. [3] Cuando el dominio de la función son los números naturales, las condiciones suficientes para que la definición sea válida son que se dé el valor de f (0) (es decir, el caso base), y que para n > 0 , se dé un algoritmo para determinar f ( n ) en términos de n ( es decir, cláusula inductiva).
En términos más generales, se pueden realizar definiciones recursivas de funciones siempre que el dominio sea un conjunto bien ordenado , utilizando el principio de recursión transfinita . Los criterios formales para determinar qué constituye una definición recursiva válida son más complejos para el caso general. Se puede encontrar un esquema de la prueba general y los criterios en Topología de James Munkres . Sin embargo, a continuación se dará un caso específico (el dominio está restringido a los números enteros positivos en lugar de a cualquier conjunto bien ordenado) de la definición recursiva general. [4]
Sea A un conjunto y sea a 0 un elemento de A . Si ρ es una función que asigna a cada función f que mapea una sección no vacía de los enteros positivos en A , un elemento de A , entonces existe una función única tal que
La suma se define recursivamente basándose en el conteo como
La multiplicación se define recursivamente como
La exponenciación se define recursivamente como
Los coeficientes binomiales se pueden definir recursivamente como
El conjunto de números primos se puede definir como el único conjunto de números enteros positivos que satisfacen
La primalidad del entero 2 es el caso base; comprobar la primalidad de cualquier entero mayor X según esta definición requiere conocer la primalidad de cada entero entre 2 y X , que está bien definida por esta definición. Este último punto se puede demostrar por inducción sobre X , para lo cual es esencial que la segunda cláusula diga "si y sólo si"; si hubiera dicho simplemente "si", la primalidad de, por ejemplo, el número 4 no estaría clara, y la aplicación posterior de la segunda cláusula sería imposible.
Los números pares se pueden definir como compuestos de
La noción de fórmula bien formada (fbf) en lógica proposicional se define recursivamente como el conjunto más pequeño que satisface las tres reglas:
La definición se puede utilizar para determinar si una cadena particular de símbolos es una wff:
Los programas lógicos pueden entenderse como conjuntos de definiciones recursivas . [5] [6] Por ejemplo, la definición recursiva de un número par puede escribirse como el programa lógico:
par ( 0 ). par ( s ( s ( X ))) :- par ( X ).
Aquí :-
representa si , y representa el sucesor de , es decir , como en la aritmética de Peano . s(X)
X
X+1
El lenguaje de programación lógica Prolog utiliza razonamiento inverso para resolver objetivos y responder consultas. Por ejemplo, dada la consulta, produce la respuesta . Dada la consulta, produce la respuesta .?- even(s(s(0)))
true
?- even(s(0))
false
El programa se puede utilizar no sólo para comprobar si una consulta es verdadera, sino también para generar respuestas que sí lo sean. Por ejemplo:
?- par ( X ). X = 0 X = s ( s ( 0 )) X = s ( s ( s ( s ( s ( 0 )))) X = s ( s ( s ( s ( s ( s ( s ( 0 )))))) .....
Los programas lógicos amplían significativamente las definiciones recursivas al incluir el uso de condiciones negativas, implementadas por la negación como falla , como en la definición:
par ( 0 ). par ( s ( X )) :- no ( par ( X )).