Arbol Genealogico en Prolog

Hoy les comparto un ejemplo de un programa en prolog, basado en el siguiente árbol genealógico:

Árbol Genealógico Harry Potter - https://www.pinterest.com/pin/478929741592887586/
Árbol Genealógico Harry Potter – https://www.pinterest.com/pin/478929741592887586/

Si apenas se van iniciando en prolog lo mejor sera que visiten esta introducción a prolog.

Lo primero que debemos hacer es generar nuestros hechos o lo que nuestro programa sabe, y en lo que se basara para dar respuestas a nuestras consultas.

Iniciaremos por indicarle el genero de cada uno de los integrantes de nuestro árbol genealógico como se muestra a continuación:

hombre(arthur).
hombre(bill).
hombre(louis).
hombre(teddy).
hombre(percy).
hombre(george).
hombre(fred).
hombre(harry).
hombre(james).
hombre(albus).
hombre(ron).
hombre(hugo).
mujer(molly).
mujer(fleur).
mujer(victoire).
mujer(dominique).
mujer(audrey).
mujer(lucy).
mujer(molly).
mujer(angelina).
mujer(roxanne).
mujer(ginny).
mujer(lily).
mujer(hermione).
mujer(rose).

Una vez hecho lo anterior, es momento de indicarle quien es padre de quien, quien es el «progenitor» de alguien mas, como se muestra a continuación:

progenitor(molly,bill).
progenitor(molly,percy).
progenitor(molly,george).
progenitor(molly,ginny).
progenitor(molly,ron).
progenitor(arthur,bill).
progenitor(arthur,percy).
progenitor(arthur,george).
progenitor(arthur,ginny).
progenitor(arthur,ron).
progenitor(bill,victoire).
progenitor(bill,dominique).
progenitor(bill,louis).
progenitor(fleur,victoire).
progenitor(fleur,dominique).
progenitor(fleur,louis).
progenitor(percy,lucy).
progenitor(percy,molly).
progenitor(audrey,lucy).
progenitor(audrey,molly).
progenitor(george,fred).
progenitor(george,roxanne).
progenitor(angelina,fred).
progenitor(angelina,roxanne).
progenitor(ginny,james).
progenitor(ginny,lily).
progenitor(ginny,albus).
progenitor(harry,james).
progenitor(harry,lily).
progenitor(harry,albus).
progenitor(ron,hugo).
progenitor(ron,rose).
progenitor(hermione,hugo).
progenitor(hermione,rose).

Y por ultimo es necesario indicarle quien es pareja de quien:

pareja(arthur,molly).
pareja(molly,arthur).
pareja(bill,fleur).
pareja(fleur,bill).
pareja(percy,audrey).
pareja(audrey,percy).
pareja(george,angelina).
pareja(angelina,george).
pareja(ginny,harry).
pareja(harry,ginny).
pareja(ron,hermione).
pareja(hermione,ron).
pareja(victoire,teddy).
pareja(teddy,victoire).

Una ves que concluimos con lo hechos, es momento de generar las reglas que debe tener nuestro programa:

padre(X,Y):-hombre(X),progenitor(X,Y).
madre(X,Y):-mujer(X),progenitor(X,Y).
hermanos(X,Y):-progenitor(Z,X),progenitor(Z,Y), not(X==Y).
hermano(X,Y):-hombre(X),hermanos(X,Y).
hermana(X,Y):-mujer(X),hermanos(X,Y).
esposo(X,Y):-pareja(X,Y),hombre(X).
esposa(X,Y):-pareja(X,Y),mujer(X).
suegro(X,Y):-padre(X,Z),pareja(Y,Z).
suegra(X,Y):-madre(X,Z),esposos(Y,Z).
yerno(X,Y):-suegro(Y,X);suegra(Y,X),hombre(X).
nuera(X,Y):-suegro(Y,X);suegra(Y,X),mujer(X).
cuñados(X,Y):-((pareja(X,Z),hermanos(Z,Y));(pareja(Y,Z),hermanos(Z,X))).
cuñado(X,Y):-cuñados(X,Y),hombre(X).
cuñada(X,Y):-cuñados(X,Y),mujer(X).
abuelo(X,Y):-progenitor(Z,Y),padre(X,Z).
abuela(X,Y):-progenitor(Z,Y),madre(X,Z).
nieto(X,Y):-progenitor(Y,Z),progenitor(Z,X),hombre(X).
nieta(X,Y):-progenitor(Y,Z),progenitor(Z,X),mujer(X).
tio(X,Y):-progenitor(Z,Y),(hermano(X,Z);cuñado(X,Z)).
tia(X,Y):-progenitor(Z,Y),(hermana(X,Z);cuñada(X,Z)).
primo(X,Y):-progenitor(Z,X),progenitor(W,Y),hermanos(Z,W),hombre(X).
prima(X,Y):-progenitor(Z,X),progenitor(W,Y),hermanos(Z,W),mujer(X).

En las reglas anteriores esta definida cada una de las relaciones posibles que se pueden llegar a dar en el árbol genealógico que les comparto.

Y ahora estamos listos para realizar consultas a nuestro programa:

consultas

Espero y este ejemplo les sea de utilidad, cualquier cosa no duden en comentarla y de antemano muchas gracias.

Anuncio publicitario

6 Comentarios Agrega el tuyo

  1. Moises dice:

    Tu arbol genealogico esta ma xD

    Me gusta

    1. thunderius15 dice:

      Especificamente que parte esta mal?

      Me gusta

      1. Moises dice:

        En que victoire, no es progenitora de teddy, de ahi en mas esta bien xD

        Me gusta

      2. thunderius15 dice:

        ya lei un poquito hacerca de vitoire y teddy 😀 ahorita lo corrijo, muchas gracias.

        Me gusta

  2. xiomara dice:

    Disculpa, en las reglas de hermanos, hermana, hermano, tia, tio, se repiten 2 veces las repuesta q da xP

    Me gusta

    1. thunderius15 dice:

      Gracias por el dato n.n lo checo y lo corrijo 😀

      Me gusta

Deja una respuesta

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s