Reglas Recursivas

padre(juanito, pepe).
padre(pepe, luis).
padre(luis, carlosI).

ancestro(X,Y) :- padre(X,Y).
ancestro(X,Z) :- padre(X,Y), ancestro(Y,Z).

?- ancestro(juanito, carlosI).

Probar con diferentes ordenes de las reglas y del cuerpo de la segunda regla.

Con todo tipo de pregunta:

1
2 :- A,B

2 :- A,B
1
Solo si existe el ancestro
1
2 :- B,A
Loop todo el tiempo
2 :- B,A
1

Problemas: hacer recursiones en donde se llama a sí mismo (sin ningn cambio) de nuevo: e.g., $P :- P$

casado(X,Y) :- casado(Y,X).

padre(X,Y) :- hijo(Y,X).
hijo(A,B) :- padre(B,A).

El orden óptimo varía con el uso, e.g.:

a) abuelo(X,Z) :- padre(X,Y), padre(Y,Z).
vs.
b) abuelo(X,Z) :- padre(Y,Z), padre(X,Y).

a) si ?- abuelo(nombre,Var).
b) si ?- abuelo(Var,Nombre).

Otros parecidos:

liga(a,b).	liga(b,d).
liga(a,c).	liga(d,e).
liga(c,d).	liga(c,f).

conecta(Nodo1,Nodo2) :- liga(Nodo1,Nodo2).
conecta(Nodo1,Nodo2) :- liga(Nodo1,Nodo3), conecta(Nodo3,Nodo2).

sucesor(1,2).
sucesor(2,3).
sucesor(3,4).
...

menor(Num1,Num2) :- sucesor(Num1,Num2).
menor(Num1,Num2) :- sucesor(Num1,Num3), menor(Num3,Num2).



emorales 2012-05-03