domingo, 18 de diciembre de 2011

Árbol Genealógico en Prolog

En esta entrada trataremos sobre la representación de un árbol genealógico en prolog mediante un ejemplo del árbol de la familia Gonzales. Luego, codificaremos los hechos en Prolog, especificando quien es padre de quien y quien es madre de quien, según se representa en el árbol genealógico y a partir de estas relaciones podremos codificar functores que expresen las demás relaciones de parentesco en la familia.

La familia Gonzales

A continuación, presentamos el árbol genealógico de la familia Gonzales (clic en la imagen para agrandar).


Codificación en Prolog

% Hechos
esMadreDe(sara, jorge).
esMadreDe(sara, gonzalo).
esMadreDe(sara, lucia).
esMadreDe(lucia, jose).
esMadreDe(lucha, martin).
esMadreDe(daniela, ana).
esMadreDe(daniela, miguel).
esMadreDe(carmen, dora).
esMadreDe(carmen, enrique).
esPadreDe(manuel, gonzalo).
esPadreDe(manuel, lucia).
esPadreDe(manuel, fernando).
esPadreDe(jorge, martin).
esPadreDe(jorge, francisco).
esPadreDe(gonzalo, ana).
esPadreDe(gonzalo, miguel).
esPadreDe(fernando, dora).
esPadreDe(fernando, enrique).

% Reglas
esAbuelaDe(A,B) :-
 esMadreDe(A, N),
 esMadreDe(N, B).
esAbuelaDe(A,B) :-
 esPadreDe(A, N),
 esPadreDe(N, B).
esAbuelaDe(A,B) :-
 esPadreDe(A, N),
 esMadreDe(N, B).
esAbuelaDe(A,B) :-
 esMadreDe(A, N),
 esPadreDe(N, B).
esNietoDe(A, B) :-
 esAbuelaDe(B, A).
esHermanoDe(A, B) :-
 esMadreDe(N, A),
 esMadreDe(N, B),
 not(A=B).
esHermanoDe(A, B) :-
 esPadreDe(N, A),
 esPadreDe(N, B),
 not(A=B).
esSobrinoDe(A, B) :-
 esHermanoDe(N, A),
 esMadreDe(N, B).
esSobrinoDe(A, B) :-
 esHermanoDe(N, A),
 esPadreDe(N, B).
esTioDe(A, B) :-
 esSobrinoDe(B, A).
esPrimoDe(A, B) :-
 esTioDe(A, N),
 esMadreDe(N, B),
 not(A=B).
esPrimoDe(A, B) :-
 esTioDe(A, N),
 esPadreDe(N, B),
 not(A=B).

Como podemos observar, a partir de los hechos obtenidos del árbol genealógico (relaciones de paternidad "EsPadreDe" y "EsMadreDe", podemos inferir todas las demás relaciones de parentesco como abuelo, primo, tío, nieto, hermano entre otros.

No hay comentarios:

Publicar un comentario