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.