¡Esta es una revisión vieja del documento!
Tabla de Contenidos
Soluciones a ejercicios
ejercicios de prolog, 30/03/09
familia
%%%%%%%%%%%% %% HECHOS %% %%%%%%%%%%%% mujer(pepa). mujer(lucía). mujer(blanca). mujer(rosa). mujer(alba). mujer(inés). mujer(irene). hombre(armando). hombre(julián). hombre(esteban). hombre(mario). hombre(alejandro). hombre(martín). hombre(matías). progenitor(pepa,lucía). progenitor(pepa,blanca). progenitor(pepa,mario). progenitor(lucía,rosa). progenitor(lucía,alba). progenitor(blanca,inés). progenitor(blanca,martín). progenitor(irene,matías). progenitor(armando,lucía). progenitor(armando,blanca). progenitor(armando,mario). progenitor(julián,rosa). progenitor(julián,alba). progenitor(alejandro,inés). progenitor(alejandro,martín). progenitor(mario,matías). %%%%%%%%%%%% %% REGLAS %% %%%%%%%%%%%% padre(X,Y) :- hombre(X), progenitor(X,Y). madre(X,Y) :- mujer(X), progenitor(X,Y). hijo(X,Y) :- hombre(X), progenitor(Y,X). hija(X,Y) :- mujer(X), progenitor(Y,X). abuelo(X,Y) :- hombre(X), progenitor(X,Z), progenitor(Z,Y). abuela(X,Y) :- mujer(X), progenitor(X,Z), progenitor(Z,Y). hermano(X,Y) :- hombre(X), progenitor(Z,X), progenitor(Z,Y), not(X=Y). hermana(X,Y) :- mujer(X), progenitor(Z,X), progenitor(Z,Y), not(X=Y). tío(X,Y) :- hermano(X,Z), progenitor(Z,Y). tía(X,Y) :- hermana(X,Z), progenitor(Z,Y). primo(X,Y) :- hijo(X,Z), progenitor(W,Y), ( hermano(Z,W) ; hermana(Z,W) ). prima(X,Y) :- hija(X,Z), progenitor(W,Y), ( hermano(Z,W) ; hermana(Z,W) ). hijoúnico(X) :- not(hermano(_,X) ; hermana(_,X)). % vamos a ver más sobre este problema en la clase
Otra opción para hijo único que funciona mejor, más acorde a nuestras intuiciones sobre el concepto:
hijoúnico(X) :- ( hombre(X) ; mujer(X) ) , ( not(hermano(_,X) ; hermana(_,X)) ).
Esta opción funciona mejor porque el árbol de búsqueda de resultados que se arma y sobre el cual el intérprete hace backtracking es considerablemente distinto.
ejercicios de prolog, 6/04/09
extensión de familia
Incorporamos cuñados, suegras y demás familias políticas. Para ello nos resultará muy útil definir el predicado “pareja”, y podremos escribir el resto de relaciones en función de ella.
pareja(X,Y) :- progenitor(X,Z), progenitor(Y,Z). cuñado(X,Y) :- hermano(X,Z), pareja(Z,Y). cuñada(X,Y) :- hermana(X,Z), pareja(Z,Y). suegra(X,Y) :- hijo(Z,X), madre(Y,Z). suegro(X,Y) :- hijo(Z,X), padre(Y,Z).
Fíjense que no hay que explicitar el sexo del cuñado, suegra, etc. porque ya está implícito en los predicados “hermano” y “madre”, respectivamente.
Para incorporar la regla “hermano mayor”, la única posibilidad es declarar hechos nuevos, en concreto, hechos que nos permitan saber si alguien es mayor o menor que otra persona. Eso se puede hacer más o menos ad hoc: lo más ad hoc que se me ocurre es declarar el hecho mayorQue
entre los pares de hermanos, lo menos ad hoc, declarar la edad de cada persona e inferir de ese dato la relación mayorQue
, de la siguiente manera:
%%% declaramos hechos sobre la edad de algunos miembros de la familia %%% edad(lucía,28). edad(blanca,26). edad(mario,24). mayor(X,Y) :- edad(X,EX), edad(Y,EY), EX>EY. hermanoMayor(X,Y) :- hermano(X,Y), mayor(X,Y). hermanoMenor(X,Y) :- hermano(X,Y), mayor(Y,X). hermanaMayor(X,Y) :- hermana(X,Y), mayor(X,Y). hermanaMenor(X,Y) :- hermana(X,Y), mayor(Y,X).
¿Cómo sería un programa para recomendar amigos en una red social tipo facebook?
¿Cómo podemos hacer un programa no muy largo que, dado un animal, nos diga si es ovíparo o vivíparo, si vive en la tierra, en el agua o en el aire, si come carne o vegetales, etc.? Traten de usar generalizaciones del tipo si es mamífero, entonces…
. En esta aproximación, cómo tratarían excepciones como “delfín” o “guppi”?
Tenemos una lista de las conexiones por tren entre pares de ciudades, por ejemplo conectadas(Tarragona,Barcelona).
. ¿Cómo sería un programa que nos ayudara a saber si podemos llegar de una ciudad a otra, es decir, si existe una lista de conexiones que nos lleve de una ciudad a otra, o bien eso es imposible? Primero, traten de hacer un programa que nos diga si podemos llegar de una ciudad a otra directamente o bien en dos o en tres pasos…