lunes, 23 de septiembre de 2013

Prolog: casos base y el resorte recursivo

El querido Prolog, para este post voy a suponer que se tienen nociones basicas de la sintaxis de prolog. Mas que nada quiero explicar algunas cosas un poco raras que tiene prolog.
 
Los casos base:

    En prolog todo es recursivo, no existen ni for, while, case, nada de eso. En vistas de esta hermosa cualidad definir los casos base gana una importancia mucho mayor a la usual. Pero, como definir un correcto caso base ? En general hay que pensar como queremos iniciar una variable (0 o []), aunque todo depende de como se diseñe el algoritmo.
 
El "resorte recursivo":

    Ese es el nombre que le di a una de las cualidades de la recursion, que es: Cuando se ejecuta una funcion recursiva primero chequea si esta en el caso base, de no ser asi se llama de nuevo a si misma hasta llegar al caso base. 

Definamos una simple funcion para entenderlo mejor:

func([A|B],[A|L]):- func(B,L).
func([],[]).

Ahora si lo ejecutamos con la consulta func([1,2,3],B) haria esto:

func([1,2,3], B)
func([2,3], B)  [quedo 'flotando' el 1]
func([3],B)
func([],[]) [en el caso base y B unifico con [], ahora va a volver por donde vino]
func([3],[3])
func([2,3],[2,3])
func([1,2,3],[1,2,3])

B=[1,2,3]

Claro que nosotros solo vemos el resultado y esta es una version simplificada de lo que veriamos si estuvieramos en modo trace. Pero supongo que es suficiente para entender el punto.
 

No hay comentarios:

Publicar un comentario