Está en la página 1de 11

PROLOG

Tema 4:
Recursividad

UNIVERSIDAD DE VALLADOLID
1. Recursividad (I)
 La recursividad es un concepto fundamental en
computación.
 Necesitamos recursividad en Prolog cuando se debe
repetir un procedimiento conocido y no sabemos
cuántas veces, solo sabemos cuándo hemos llegado
al final.
1. Recursividad (II)
 Cómo se construye:
Necesitamos al menos 2 sentencias o
cláusulas (podría haber más):
 Primera sentencia: Un hecho o una regla (caso
base de la recursividad. Nos permite parar. Podría
haber más de un caso base). Es una solución
simple para un caso particular.

 Segunda sentencia: Regla (donde está expresada


explícitamente la recursividad porque la cabecera
se repite en el cuerpo y así el procedimiento se
llama a sí mismo).
1. Recursividad (III)
 Mediante recursividad se va tratando cada vez un
problema de tamaño menor.

 El problema de tamaño más pequeño es el caso base


que alguna vez se alcanzará.
1. Recursividad (IV)
 Necesitamos definir dos predicados (puede
haber otros):
 Uno expresa una relación directa o inmediata
entre los elementos del dominio
 El otro expresa una relación indirecta, es decir,
en una cadena de recursividad puede haber varios
elementos del dominio, no sabemos cuántos.
1. Recursividad (V)
 En uno de los libros de referencia de Prolog (Bratko) ilustran la
recursividad con el ejemplo de predecesor en un árbol
genealógico (relación indirecta), usando como relación directa
la de padre.
 Primero vamos a ver cómo expresaríamos algunas relaciones
sin usar recursividad.
X
X padre
pred pred
padre
Y
padre
Z Z
Una persona es predecesora
Una persona es predecesora de
de otra si es padre de ella
otra si es abuela de ella
pred(X,Z):-padre(X,Z).
pred(X,Z):-padre(X,Y), padre(Y,Z).
1. Recursividad (VI)
X
X padre

padre Y1
padre
Y1
Y2 pred
padre pred
padre
Y2
Y3
padre
padre
Z
Z
Una persona es predecesora de otra si
es bisabuela de ella
Una persona es predecesora de otra si es
pred(X,Z):-padre(X,Y1), padre(Y1,Y2), padre(Y2,Z).
tatarabuela de ella

pred(X,Z):-padre(X,Y1), padre(Y1,Y2),padre(Y2,Y3),padre(Y3,Z).
1. Recursividad (VII)
 Y así podríamos seguir indefinidamente. Eso no sería una
buena programación. Para mejorarlo usamos recursividad
ya que queremos saber si una persona es predecesora
de otra y no sabemos cuántas generaciones intermedias
hay.

 Por tanto, definiremos un caso base y un caso recursivo:


 El caso base es la primera de las reglas (en este ejemplo es una
regla, pero podría ser un hecho), es la solución simple para el
caso particular más pequeño, cuando la persona que queremos
ver si es predecesora de otra, es su padre directamente.
 El caso recursivo lo vamos a construir en la siguiente diapositiva.
2ª SENTENCIA

1. Recursividad (VIII) X
padre

1ª SENTENCIA
pred

X pred
pred
padre

Z …

Una persona es predecesora Z


de otra si es padre de ella
Una persona X es predecesora de otra Z, si X es
pred(X,Z):-padre(X,Z). padre de otra Y, y esta Y es predecesora de Z
pred(X,Z):-padre(X,Y), pred(Y,Z).
2. Ejercicio ejemplo (I)
 Escribir las dos sentencias anteriores y completar
el programa con una pequeña base de hechos en
los que se relacionen personas en un árbol
genealógico.

 Hacer consultas para saber


 si una persona es predecesora de otra
 quiénes son las personas predecesoras de otra
 quiénes son las personas descendientes de otra
2. Ejercicio ejemplo (II)
 Escribir las dos sentencias necesarias para saber
si hay un camino entre 2 nodos en un grafo
dirigido. Dibujar un pequeño grafo dirigido y
completar el programa modelando ese grafo
mediante los hechos necesarios.

 Hacer consultas para saber


 si hay un camino entre dos nodos
 cuáles son los nodos que están en el camino de uno
dado, bien sea nodo origen, por tanto, obtengo los
nodos sucesores
 o bien sea nodo destino y obtengo los nodos
antecesores

También podría gustarte