Cartilla de Ejercicios Modelo Prolog

Universidad Tecnológica Nacional FRC-Dpto. de Ing. en Sistemas de Información Paradigmas de Programación 2013 Cartilla

Views 118 Downloads 1 File size 366KB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

Universidad Tecnológica Nacional FRC-Dpto. de Ing. en Sistemas de Información

Paradigmas de Programación 2013

Cartilla de prácticos modelo Prolog

Guía de prácticos Prolog

Página 1

Universidad Tecnológica Nacional FRC-Dpto. de Ing. en Sistemas de Información

Paradigmas de Programación 2013

Semana 1 Ejercicio 1 Usando consola: a) b) c) d) e) f) g) h) i) j) k) l)

Comprobar que 150 sea un entero Comprobar que 12.5 es un float Comprobar que ‘Juan Perez’ es un String Comprobar que 20 es la suma de 5 y 15 Comprobar que -5 es la resta entre 5 y 10 Mostrar el cociente entre 24560 y 756 Mostrar el cociente entero de la división anterior Mostrar el resto de la división entre 28753 y 15963 Demostrar que 5 es la raíz cuadrada de 25. Cuál es el resultado de sumar 35678 con 9876? Puede comprobar que el resultado anterior es la suma de 35678 y 9876? Compruebe que los valores absolutos de 4 y -4 son iguales.

Resolucion …

Ejercicio 2 Definición de predicados: a) b) c) d) e)

Escribir un predicado ++ con aridad 2, que sume a un número un 1. Defina un predicado distinto(X,Y) que diga si X es distinto a Y. Definir un predicado suma (X,Y,Z) que devuelva verdadero si Z es la suma de X y de Y. Definir el predicado mayor(X,Y,Z) que devuelve verdadero si Z es mayor que X e Y Escribir un predicado que determine la siguiente función f(x) va a ser: 0. Si x 125.

punto_3(Leg,Nom,Ap,NomLoc,NomArea,Ant):trabajador(Leg,Nom,Ap,domicilio(_,_,IDLOC),IDAREA,efectivo(_,Ant,_)),localidad(IDLOC,NomL oc),area(IDAREA,NomArea),Ant>10.

punto_4(Leg,Sal):-(trabajador(Leg,_,_,_,_,contrato(X,Y,Z)), Sal is X*Y*Z); trabajador(Leg,_,_,_,_,efectivo(X,Y,Z)), Sal is X+(X*Y*Z)/100.

punto_5(Leg,Nomb,Ap,Area,Loc):trabajador(Leg,Nomb,Ap,domicilio(_,_,IDLOC),IDAREA,contrato(_,_,_)), area(IDAREA,Area),localidad(IDLOC,Loc),IDLOC =\=1.

punto_6(Leg,Sal):-(trabajador(Leg,_,_,domicilio(_,_,IDLOC),_,contrato(X,Y,Z)),IDLOC=:=1,Sal is X*Y*Z);

(trabajador(Leg,_,_,domicilio(_,_,IDLOC),_,contrato(X,Y,Z)),IDLOC=\=1,Sal is X*Y*Z+250);

Guía de prácticos Prolog

Página 11

Universidad Tecnológica Nacional FRC-Dpto. de Ing. en Sistemas de Información

Paradigmas de Programación 2013

(trabajador(Leg,_,_,_,_,efectivo(X,Y,Z)), Sal is X+(X*Y*Z)/100).

Semana 3 Ejercicio 8 Ranking ATP 2012 La Asociación de Tenis Profesional (ATP), en su página web, ha dado la lista y estadística de los mejores jugadores de tenis del mundo. En la lista (adjunta como hechos al final del ejercicio), se pueden ver los siguientes datos: 1. Ranking 2. Nombre 3. Nacionalidad 4. Partidos ganados 5. Partidos perdidos 6. Aces totales 7. Promedio de aces por partido 8. Porcentaje de servicio ganados 9. Porcentaje de partidos ganados en el servicio 10. Porcentaje de breakpoints ganados 11. Porcentaje de breakpoints salvados Teniendo en cuenta esta información, responda las siguientes preguntas creando predicados según sea necesario:

a) Nombre y posición de todos los tenistas argentinos b) ¿Quiénes son los tenistas que tienen más del 80% de partidos ganados en el servicio? c) ¿Quiénes son los tenistas que salvaron entre 50 y 60 breakpoints pero que están ubicados después de la posición número 20 del ranking? d) Dado un jugador en especial, ¿Puede obtener el nombre de todos sus compatriotas que tienen mayor número de partidos ganados? e) Dado un jugador, puede decirme cuál fue el porcentaje de partidos ganados y si tiene más chances de salvar un breakpoint o hacer un breakpoint? f) Se dice que un jugador tendrá más chances de ganar si el promedio de partidos ganados es mayor que el de su oponente, no está separado por más de 5 posiciones del rival en el ranking y tiene el mayor porcentaje de servicios ganados. Implemente una regla que permita saber quién será el ganador entre dos jugadores. Se conoce también las debilidades y fortalezas de los jugadores, en particular, se conoce que: En cancha de césped, los ganadores son: Guía de prácticos Prolog

Página 12

Universidad Tecnológica Nacional FRC-Dpto. de Ing. en Sistemas de Información

Paradigmas de Programación 2013

novak_djokovic, jo-wilfried_tsonga, milos_raonic, marcos_baghdatis, jarkko_nieminen, andy_murray, john_isner, sam_querrey, kevin_anderson, martin_klizan, richard_gasquet, david_ferrer En cancha de arcilla, los ganadores son: novak_djokovic, andy_roddick, philipp_kohlschreiber, alexandr_dolgopolov, julien_benneteau, tommy_haas, fernando_verdasco, jurgen_melzer, tomas_berdych, ikhail_youzhny, andreas_seppi, stanislas_wawrinka, david_ferrer, juan_martin_del_potro En cancha de cemento, los ganadores son: florian_mayer, david_ferrer, pablo_andujar, roger_federer, marin_cilic, janko_tipsarevic, nicolas_almagro, gilles_simon, mardy_fish, thomaz_bellucci, novak_djokovic, andy_roddick, juan_martin_del_potro En cancha de sintetica, los ganadores son: kei_nishikori, rafael_nadal, viktor_troicki, juan_martin_del_potro, juan_monaco, jeremy_chardy, feliciano_lopez, marcel_granollers, novak_djokovic, andy_roddick, david_ferrer, juan_martin_del_potro Teniendo esta información, realice las siguientes actividades y responda las preguntas: a) Escriba el predicado ganador_en(tipo_cancha, X) para cada tipo de cancha, que evalúe como verdadero a X (un jugador) si pertenece a la lista de jugadores mencionada. b) Evalúe para distintos jugadores si son ganadores o no en los distintos tipos de canchas. ¿Puede obtener un listado de todos los jugadores que ganarán en césped? c) Tomando distintos jugadores como entrada, escriba un predicado que muestre las superficies sobre las que podrá ganar ese jugador (se deberán evaluar todas las superficies). d) Reescriba el predicado del punto anterior pero usando una lista de tipos de superficie como entrada (además del nombre del jugador). e) Escriba un predicado que permita determinar para una lista de jugadores en una cancha del tipo arcilla, quienes tendrán más posibilidades de ganar. Usar la siguiente lista: [tommy_haas, andy_murray, gilles_simon, feliciano_lopez] f) Escriba un predicado que permita contabilizar la cantidad de superficies sobre las cuales un jugador puede ganar. Usar como entrada el nombre del jugador y una lista con los distintos tipos de superficie. g) Utilice el predicado calculado en el punto f de la primera sección para determinar si el primer jugador de la siguiente lista puede ganarle al resto [jurgen_melzer, john_isner, julien_benneteau, feliciano_lopez, marin_cilic, mardy_fish, thomaz_bellucci, marcel_granollers] Resolución jugador(1,roger_federer, sui, 61, 8,559, 8.1,78,91,42,69). Guía de prácticos Prolog

Página 13

Universidad Tecnológica Nacional FRC-Dpto. de Ing. en Sistemas de Información

Paradigmas de Programación 2013

jugador(2,novak_djokovic, srb, 65, 11,447, 5.9,74,87,46,67). jugador(3,andy_murray, gbr, 50, 12,455, 7.3,74,84,41,68). jugador(4,rafael_nadal, esp, 42, 6,160, 3.3,75,88,49,71). jugador(5,david_ferrer, esp, 62, 14,238, 3.1,73,85,45,64). jugador(6,jo-wilfried_tsonga, fra, 48, 3,547, 8.3,76,87,42,70). jugador(7,tomas_berdych, cze, 50, 18,545, 8.0,77,87,44,70). jugador(8,juan_martin_del_potro, arg, 53, 14,461, 6.9,74,87,44,68). jugador(9,janko_tipsarevic, srb, 52, 21,575, 7.9,76,85,40,64). jugador(10,juan_monaco, arg, 38, 16,88, 1.6,67,77,42,58). jugador(11,nicolas_almagro, esp, 53, 18,577, 8.1,77,86,39,62). jugador(12,john_isner, usa, 43, 18,917, 15.0,78,91,31,73). jugador(13,richard_gasquet, fra, 38, 19,311, 5.5,73,84,42,65). jugador(14,milos_raonic, can, 43, 17,921, 15.4,83,93,39,74). jugador(15,kei_nishikori, jpn, 35, 17,125, 2.4,69,78,39,58). jugador(16,marin_cilic, cro, 34, 16,311, 6.2,72,81,43,60). jugador(17,stanislas_wawrinka, sui, 32, 17,367, 7.5,73,83,44,66). jugador(18,gilles_simon, fra, 38, 22,247, 4.1,69,76,41,59). jugador(19,philipp_kohlschreiber, ger, 41, 21,474, 7.6,74,85,45,65). jugador(20,alexandr_dolgopolov, ukr, 28, 21,402, 8.2,75,80,41,62). jugador(21,tommy_haas, ger, 27, 14,257, 6.3,75,83,38,64). jugador(22,sam_querrey, usa, 31, 22,590, 11.1,80,86,38,64). jugador(23,fernando_verdasco, esp, 29, 19,237, 4.9,71,82,40,65). jugador(24,marcel_granollers, esp, 20, 21,171, 4.2,69,74,34,57). jugador(25,florian_mayer, ger, 22, 23,167, 3.7,71,78,39,60). jugador(26,andreas_seppi, ita, 32, 24,223, 4.0,70,78,44,58). jugador(27,andy_roddick, usa, 23, 16,358, 9.2,75,84,36,60). Guía de prácticos Prolog

Página 14

Universidad Tecnológica Nacional FRC-Dpto. de Ing. en Sistemas de Información

Paradigmas de Programación 2013

jugador(28,mardy_fish, usa, 21, 11,301, 9.4,78,85,44,66). jugador(29,feliciano_lopez, esp, 23, 23,468, 10.2,77,86,38,71). jugador(30,mikhail_youzhny, rus, 29, 17,199, 4.3,71,80,40,60). jugador(31,jeremy_chardy, fra, 23, 18,304, 7.4,74,81,38,68). jugador(32,viktor_troicki, srb, 25, 25,379, 7.6,71,74,43,56). jugador(33,julien_benneteau, fra, 25, 21,310, 6.7,71,79,42,62). jugador(34,martin_klizan, svk, 18, 12,101, 3.4,70,76,44,60). jugador(35,jurgen_melzer, aut, 17, 21,175, 4.6,69,75,44,57). jugador(36,marcos_baghdatis, cyp, 30, 22,334, 6.4,73,80,41,61). jugador(37,jarkko_nieminen, fin, 25, 24,130, 2.7,67,75,42,56). jugador(38,kevin_anderson, rsa, 25, 22,507, 10.8,74,85,35,65). jugador(39,thomaz_bellucci, bra, 22, 18,203, 5.1,71,78,38,62). jugador(40,pablo_andujar, esp, 19, 25,71, 1.6,65,68,40,52).

%a- Nombre y posición de todos los tenistas argentinos %jugador(P,N,arg,_,_,_,_,_,_,_,_).

% b)¿Quiénes son los tenistas que tienen más del 87% de partidos ganados % en el servicio. punto_b(N,Nac,P):-jugador(_,N,Nac,_,_,_,_,_,P,_,_), P>87.

% c)¿Quiénes son los tenistas que salvaron entre 50 y 60 break points % pero que están ubicados después de la posición número 20 del ranking? punto_c(P,N,BP):-jugador(P,N,_,_,_,_,_,_,_,_,BP), BP>=50, BP==20. Guía de prácticos Prolog

Página 15

Universidad Tecnológica Nacional FRC-Dpto. de Ing. en Sistemas de Información

Paradigmas de Programación 2013

% d)Dado un jugador en especial, ¿Puede obtener el nombre de todos sus % compatriotas que tienen mayor número de partidos ganados? punto_d(J,C,PG):-jugador(_,J,N,PGJ,_,_,_,_,_,_,_), jugador(_,C,N,PG,_,_,_,_,_,_,_), PG>PGJ.

% e)Dado un jugador, puede decirme cuál fue el porcentaje de partidos % ganados y si tiene más chances de salvar un break point o hacer un % break point? punto_e(J,P):-jugador(_,J,_,PG,PP,_,_,_,_,BPG, BPS), P is PG*100/(PG+PP), (BPG>=BPS, write('Tiene más chances de ganar un breakpoint'), ! ; write('Tiene mas chances de salvar un breakpoint')).

%f)Se dice que un jugador tendrá más chances de ganar si el promedio de partidos ganados es mayor que el de su oponente, no está separado por más de 5 posiciones del rival en el ranking y tiene el mayor porcentaje de servicios ganados. Implemente una regla que permita quién será el ganador entre dos jugadores.

punto_f_prom(J,Prom):-jugador(_,J,_,PG,PP,_,_,_,_,_,_),Prom is PG/(PG+PP). punto_f_distancia(J1,J2,D):-jugador(R1,J1,_,_,_,_,_,_,_,_,_),jugador(R2,J2,_,_,_,_,_,_,_,_,_), D is abs(R1-R2). punto_f(J1,J2):-punto_f_prom(J1,P1), punto_f_prom(J2,P2),P1>P2, punto_f_distancia(J1,J2,D), D=PSG2.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %SEGUNDA PARTE - LISTAS

Guía de prácticos Prolog

Página 16

Universidad Tecnológica Nacional FRC-Dpto. de Ing. en Sistemas de Información

Paradigmas de Programación 2013

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%Punto a ganador_en(cesped, X):-member(X,[novak_djokovic,jowilfried_tsonga,milos_raonic,marcos_baghdatis,jarkko_nieminen,andy_murray,john_isner,sam_ querrey,kevin_anderson,martin_klizan,richard_gasquet,david_ferrer]),!.

ganador_en(arcilla, X):member(X,[novak_djokovic,andy_roddick,philipp_kohlschreiber,alexandr_dolgopolov,julien_ben neteau,tommy_haas,fernando_verdasco,jurgen_melzer,tomas_berdych,ikhail_youzhny,andreas _seppi,stanislas_wawrinka,david_ferrer,juan_martin_del_potro]),!.

ganador_en(cemento, X):member(X,[florian_mayer,david_ferrer,pablo_andujar,roger_federer,marin_cilic,janko_tipsarevic ,nicolas_almagro,gilles_simon,mardy_fish,thomaz_bellucci,novak_djokovic,andy_roddick,juan_ martin_del_potro]),!.

ganador_en(sintetica, X):-member(X, [kei_nishikori,rafael_nadal,viktor_troicki,juan_martin_del_potro,juan_monaco,jeremy_chardy,feli ciano_lopez,marcel_granollers,novak_djokovic,andy_roddick,david_ferrer,juan_martin_del_potr o]),!.

% Punto c punto_2c(J):-(ganador_en(cesped,J),write('Puede ganar en cesped'),nl); (ganador_en(arcilla,J),write('Puede ganar en arcilla'),nl); (ganador_en(cemento,J),write('Puede ganar en cemento'),nl); (ganador_en(sintetica,J),write('Puede ganar en sintético'),nl).

% Punto d punto_2d(_,[],_):-!.

Guía de prácticos Prolog

Página 17

Universidad Tecnológica Nacional FRC-Dpto. de Ing. en Sistemas de Información

Paradigmas de Programación 2013

punto_2d(J,[H|T],S):-(ganador_en(H,J),concat('Puede ganar en ',H,S));punto_2d(J,T,S).

% Punto e punto_2e(C,[H|T]):-ganador_en(C,H),write(H),write(' puede ganar'),nl;punto_2e(C,T).

% Punto f punto_2f(_,[],X):-X is 0,!. punto_2f(J,[H|T],X):-(ganador_en(H,J),punto_2f(J,T,X1),X is X1+1); (not(ganador_en(H,J)),punto_2f(J,T,X1),X is X1).

Ejercicio 9 La Liga de la Justicia VS Los Vengadores Jeff Albertson es un reconocido vendedor de comics que nos ha pedido determinar quién podría ser el ganador en una pelea entre los miembros de La Liga de la Justicia y Los Vengadores. Para ello, nos ha dado la siguiente lista de los miembros de cada equipo y sus capacidades y aptitudes:

Personaj e

Habilidade s

Inteligenci a

¿Humano ?

LJ Exp .

Vengadores

Motiv . (1-5)

(15) Superman

1-2-3-4

8

No

5

5

5-6-7-8-914

10

Si

5

3

La Mujer Maravilla

2-8-5

9

No

3

4

Flash

3-4-9

7

Si

3

4

Batman

Guía de prácticos Prolog

Trabaj o en equipo

Temperament o

Página 18

Universidad Tecnológica Nacional FRC-Dpto. de Ing. en Sistemas de Información Linterna Verde

Paradigmas de Programación 2013

10-1-11

8

Si

1

3

12-13-2-8

8

No

2

1

Flecha Verde

7-2-5-14-17

9

Si

1

3

Capitan América

2-15-16-714

7

Si

Bueno

Bueno

Hawkeye

17-7-4

8

Si

Malo

Bueno

Iron Man

2-4-1-7-8-96-15

10

Si

Malo

Malo

Thor

1-2-7-8-1516

6

No

Bueno

Malo

Hulk

2-15-16

7

Si

Malo

Bueno

Black Widow

5-7-14

10

Si

Bueno

Bueno

Aquaman

Guía de prácticos Prolog

Código

Habilidad

1

Volar

2

Fuerza

3

Velocidad

4

Visión

5

Obtener información

6

Tecnología

7

Pelea mano a mano

8

Protección a golpes

9

Química

Página 19

Universidad Tecnológica Nacional FRC-Dpto. de Ing. en Sistemas de Información

Paradigmas de Programación 2013

10

Semi-invulnerable

11

Disparar rayos

12

Telepatía

13

Respirar bajo el agua

14

Uso de armas

15

Resistencia

16

Auto sanación

17

Experto en arquería

También sabemos que hay habilidades que son superiores a otras:

Código

Habilidad

Superior a

1

Volar

Todas

2

Fuerza

4-7-8-13

3

Velocidad

2-7-8-14

4

Visión

12-17

5

Obtener información

6-2-7-16-11

6

Tecnología

7-8-12

7

Pelea mano a mano

8-14-15

8

Protección a golpes

9-16-14

9

Química

4-7

10

Semi-invulnerable

2

11

Disparar rayos

2-3-5

Guía de prácticos Prolog

Página 20

Universidad Tecnológica Nacional FRC-Dpto. de Ing. en Sistemas de Información

Paradigmas de Programación 2013

12

Telepatía

3-11

13

Respirar bajo el agua

2-15

14

Uso de armas

2-7-8-10

15

Resistencia

16-10-7

16

Auto sanación

7-14-17

17

Experto en arquería

8

Ahora responda las siguientes preguntas:

a) Cree una regla para mostrar todas las habilidades de un determinado superhéroe. b) Muestre todos los superhéroes que posean un determinado poder y una inteligencia mayor a 6. c) Muestre todos los superhéroes que posean un determinado poder pero no otro, por ejemplo, que posean fuerza, pero no posean Telepatía. d) Realice el punto b y c pero sólo para superhéroes de La Liga de la Justicia. e) Cree una regla que permita saber dada una habilidad, a qué otras habilidades supera. f) Dada una habilidad, mostrar por qué otras habilidades es superada.

Resolución % LIstado de superheroes superheroe(superman, [1, 2, 3, 4], 8, no , liga(5, 5)). superheroe(batman, [5, 6, 7, 8, 9, 14], 10, si, liga(5, 3)). superheroe(la_mujer_maravilla, [2, 8, 5], 9, no, liga(3, 4)). superheroe(flash, [3, 4, 9], 7, si, liga(3, 4)). superheroe(linterna_verde, [10, 1, 11], 8, si, liga(1, 3)). superheroe(aquaman, [12, 13, 2, 8], 8, no, liga(2, 1)). superheroe(flecha_verde, [7, 2, 5, 14, 17], 9, si, liga(1, 3)). superheroe(capitan_america, [2, 15, 16, 7, 14], 7, si, vengadores(bueno, bueno)). Guía de prácticos Prolog

Página 21

Universidad Tecnológica Nacional FRC-Dpto. de Ing. en Sistemas de Información

Paradigmas de Programación 2013

superheroe(hawkeye, [17, 7, 4], 8, si, vengadores(malo, bueno)). superheroe(iron_man, [2, 4, 1, 7, 8, 9, 6, 15], 10, si, vengadores(malo, malo)). superheroe(thor, [1, 2, 7, 8, 15, 16, 11], 6, no, vengadores(bueno, malo)). superheroe(hulk, [2, 15, 16], 7, si, vengadores(malo, bueno)). superheroe(black_widow, [5, 7, 14], 10, si , vengadores(bueno, bueno)).

% Listado de habilidades habilidad(1, volar). habilidad(2, fuerza). habilidad(3, velocidad). habilidad(4, vision). habilidad(5, obtener_informacion). habilidad(6, tecnologia). habilidad(7, pelea). habilidad(8, proteccion_a_golpes). habilidad(9, quimica). habilidad(10, semi_invulnerable). habilidad(11, disparar_rayos). habilidad(12, telepatia). habilidad(13, respirar_bajo_el_agua). habilidad(14, armas). habilidad(15, resistencia). habilidad(16, auto_sanacion). habilidad(17, arqueria).

% Comparación de habilidades Guía de prácticos Prolog

Página 22

Universidad Tecnológica Nacional FRC-Dpto. de Ing. en Sistemas de Información

Paradigmas de Programación 2013

supera_a(1, [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17]). supera_a(2, [4, 7, 8, 13]). supera_a(3, [2, 7, 8, 14]). supera_a(4, [12, 17]). supera_a(5, [6, 2, 7, 16, 11]). supera_a(6, [7, 8, 12]). supera_a(7, [8, 14, 15]). supera_a(8, [9, 16, 14]). supera_a(9, [4, 7]). supera_a(10, [2]). supera_a(11, [2, 3, 5]). supera_a(12, [3, 11]). supera_a(13, [2, 15]). supera_a(14, [2, 7, 8, 10]). supera_a(15, [16, 10, 7]). supera_a(16, [7, 14, 17]). supera_a(17, [8]).

%punto a ver_habilidad([],S):- S = ''. ver_habilidad([H|T],Hab):-habilidad(H,Nombre), ver_habilidad(T, NombreT), concat(Nombre, ' - ',NH), concat(NH, NombreT, Hab). ver_habilidades(Heroe, Hab):-superheroe(Heroe,Lista,_,_,_), ver_habilidad(Lista, Hab).

Guía de prácticos Prolog

Página 23

Universidad Tecnológica Nacional FRC-Dpto. de Ing. en Sistemas de Información

Paradigmas de Programación 2013

%punto b punto_b(Poder, Int, H):-superheroe(H,L,I,_,_), habilidad(Id, Poder), tiene_hab(Id, L), I>Int.

tiene_hab(Id, [H|T]):-Id=:=H,!;tiene_hab(Id,T),!. tiene_hab(_,[]):-false.

%punto c punto_c(Poder1, Poder2, H):- punto_b(Poder1, 0, H), not(punto_b(Poder2, 0, H)). %punto c sin usar llamada a otros predicados punto_c2(Poder1,Poder2,H):superheroe(H,L,_,_,_), habilidad(Id, Poder1), habilidad(Id2, Poder2), tiene_hab(Id, L), not(tiene_hab(Id2,L)).

%punto d punto_db(Poder, Int, H):-superheroe(H,L,I,_,liga(_,_)), habilidad(Id, Poder), member(Id, L), I>Int. punto_dc(Poder1, Poder2, H):- punto_db(Poder1, 0, H), not(punto_db(Poder2, 0, H)).

%punto e punto_e(Hab,S):-habilidad(Cod,Hab),supera_a(Cod,L),ver_habilidad(L,S).

%punto f

Guía de prácticos Prolog

Página 24

Universidad Tecnológica Nacional FRC-Dpto. de Ing. en Sistemas de Información

Paradigmas de Programación 2013

es_superado(Cod,H,Hab):supera_a(H,Lista),member(Cod,Lista),habilidad(H,Nombre),concat(Nombre,'',Hab),!.

punto_f(_,[],''). punto_f(Cod,[H|T],Hab):-punto_f(Cod,T,X),(es_superado(Cod,H,X1),concat(X1,'',X2),concat(X2,X,Hab),!;concat(X,'',Hab),!).

Ejercicio 10 Empresa de Servicios Una empresa de servicios varios ofrece la posibilidad de realizar compras varias desde un sitio enInternet. Los usuarios solo deben registrarse e ir eligiendo cada artículo, como también sucantidad. Este sistema corre un proceso al finalizar el día que genera la siguiente base de conocimientos:

precioUnitario(producto(tomate), 12.50). precioUnitario(producto(leche, sancor), 2.45). precioUnitario(producto(papa), 4.50). precioUnitario(producto(yogur, laSerenisima), 1.75). precioUnitario(producto(yogur, sancor), 1.65). precioUnitario(producto(yogur, manfrey), 1.15). precioUnitario(producto(fósforos, los3Patitos), 1). El producto se representa como un functor con: •

El nombre de un producto genérico, o bien



El nombre de un producto y la marca que lo comercializa

compro(leo, producto(tomate), 2). compro(leo, producto(yogur, manfrey), 10). compro(leo, producto(papa), 1). compro(nico, producto(tomate), 3).

Guía de prácticos Prolog

Página 25

Universidad Tecnológica Nacional FRC-Dpto. de Ing. en Sistemas de Información

Paradigmas de Programación 2013

compro(flor, producto(yogur, laSerenisima), 2). compro(flor, producto(leche, sancor), 4). marcaImportante(sancor). marcaImportante(laSerenisima). Se pide: 1) Realice las consultas (directamente en el shell) que permitan determinar •

quiénes compraron productos de Sancor (debe devolver los individuos leo y flor)



qué compró Leo



si Leo compró 2 cosas de algún producto (debe decirme que sí).

2)Resuelva el predicado cuantoGasto/2 que relaciona una persona con el total que gastó. ? cuantoGasto(flor, Total) Total = 13.5 (3.5 de los dos yogures y 10 de las cuatro leches).

Ayuda: disponemos de una cláusula definida llamada findall/3, que colecciona todas las soluciones de un objetivo y retorna una lista como resultado con los valores del objetivo definidos por una variable.

findall (Variable, predicado objetivo, Lista).

Donde: Variable: especifica qué argumento del predicado va ser coleccionado en la lista. predicado objetivo: es el objetivo del cual los valores serán coleccionados en la Lista Lista: lista resultado con los valores obtenidos por Variable en cada objetivo evaluado.

Adicionalmente existe una segunda cláusula predefinida que permite sumar los elementos de una lista llamado sumlist/2: sumlist (Lista, Suma).

3)Codifique el predicado esMarquero/1, que relaciona las personas que sólo compran cosas de marcas importantes. Deberá retornar todas las personas sin repetir.

Guía de prácticos Prolog

Página 26

Universidad Tecnológica Nacional FRC-Dpto. de Ing. en Sistemas de Información

Paradigmas de Programación 2013

Ayuda: podría devolver una lista ordenada. (sort/2).

Resolución %Hechos precioUnitario(producto(tomate), 12.50). precioUnitario(producto(leche, sancor), 2.45). precioUnitario(producto(papa), 4.50). precioUnitario(producto(yogur, laSerenisima), 1.75). precioUnitario(producto(yogur, sancor), 1.65). precioUnitario(producto(yogur, manfrey), 1.15). precioUnitario(producto(fósforos, los3Patitos), 1).

compro(leo, producto(tomate), 2). compro(leo, producto(yogur, manfrey), 10). compro(leo, producto(papa), 1). compro(nico, producto(tomate), 3). compro(flor, producto(yogur, laSerenisima), 2). compro(flor, producto(leche, sancor), 4).

marcaImportante(sancor). marcaImportante(laSerenisima).

%Punto 2 montoCompra(Persona, Total):compro(Persona, Producto, Cantidad), precioUnitario(Producto, Precio),

Guía de prácticos Prolog

Página 27

Universidad Tecnológica Nacional FRC-Dpto. de Ing. en Sistemas de Información

Paradigmas de Programación 2013

Total is Precio * Cantidad. cuantoGasto(Persona, Monto):- findall(Total, montoCompra(Persona, Total), Totales), sumlist(Totales, Monto). %Punto 3 esMarquero(MarquerosSinRepetir):- findall(Persona,(compro(Persona, producto(_, Marca), _), marcaImportante(Marca)),Marqueros), sort(Marqueros, MarquerosSinRepetir).

Ejercicio 11 Usuarios Tenemos tres tipos de usuario, representados con functores: •

Registrándose se puede obtener un usuario por un mes trial, que se representa por su idde usuario y su fecha de registración: trial(id, fechaRegistracion)).



Para tener un usuario con menos limitaciones existe la posibilidad de pagar por un usuariopremium. Los usuarios premium tienen una cuota mensual (en MB) de downloads, quedependerá de cuánto paguen.Se representan por su id de usuario y la cuota mensual correspondiente: premium(id,cuota).



El predicadio usuario/2 indica los usuarios existentes y les asigna un identificador único,por ejemplo: usuario(2, trial(guille, fecha(10, 10, 2009)). usuario(3, trial(luis, fecha(29, 9, 2009)). usuario(4, trial(carlos, fecha(10, 9, 2009)). usuario(5, premium(martin, 1000)).

Se pide:

1) El predicado estaVigente/1 determina si una cuenta de usuario trial se creó hace un mes.Por ejemplo: ?- estaVigente(guille). Yes ?- estaVigente(luis). Yes

Guía de prácticos Prolog

Página 28

Universidad Tecnológica Nacional FRC-Dpto. de Ing. en Sistemas de Información

Paradigmas de Programación 2013

?- estaVigente(carlos). No

Para eso contamos con el predicado hoy/1 permite conocer la fecha de hoy. hoy(fecha(15,10,2009)).

2)El predicado estaDisponible/1 indica si un nombre de usuario está disponible, es decir, nofue tomado aún, por ningún usuario premium ni trial. Por ejemplo: ?- estaDisponible(guille). No. \% Hay un usuario trial con ese nombre ?- estaDisponible(martin). No. \% Hay un usuario premium con ese nombre ?- estaDisponible(nico). Yes.

Resolución %Echos parte 1 usuario(2, trial(guille, fecha(10, 10, 2009))). usuario(3, trial(luis, fecha(29, 9, 2009))). usuario(4, trial(carlos, fecha(21, 9, 2012))). usuario(5, premium(martin, 1000)). %Parte 2 %Punto 1 hoy(fecha(15,10,2012)). estaVigente(Cuenta):- usuario(_,trial(Cuenta, fecha(D,M,A))), hoy(fecha(D1,M1,A1)), A=:=A1, (M=:=M1; (DM is M1-M, DM =:=1, D > D1)).

%Punto 2 existeUsuario(Nombre):-usuario(_,trial(Nombre,_)), estaVigente(Nombre). Guía de prácticos Prolog

Página 29

Universidad Tecnológica Nacional FRC-Dpto. de Ing. en Sistemas de Información

Paradigmas de Programación 2013

existeUsuario(Nombre):-usuario(_,premium(Nombre,_)). estaDisponible(Nombre):- not(existeUsuario(Nombre)).

Ejercicios 12 Desarrollar un programa en Prolog que permita manejar listas con los siguientes predicados: •

cuenta(Lista, Elementos). Permite contar los elementos de un lista



suma(Lista, Suma). Permite sumar los elementos de una lista siempre que éstos sean numéricos. En caso de contener al menos un elemento no numérico retorna false.



ultimo (X, Lista). Permite obtener el último elemento de una lista.



concatena(L1, L2, L3). Permite concatenar dos listas dando lugar a una tercera



inversa(L1, L2). Permite generar una lista L2 como inversa de L1. Nota: para generar la segunda lista puede utilizar el predicado concatena/3 del punto anterior.

Resolución

miembro(X,[X|_]). miembro(X,[_|Y]) :- miembro(X,Y). cuenta([],0). cuenta([_|Y],N) :- cuenta(Y,M), N is M+1.

concatena([],L,L). concatena([X|L1],L2,[X|L3]) :- concatena(L1,L2,L3). ultimo(X,[X]). ultimo(X,[_|Y]) :- ultimo(X,Y). Guía de prácticos Prolog

Página 30

Universidad Tecnológica Nacional FRC-Dpto. de Ing. en Sistemas de Información

Paradigmas de Programación 2013

inversa([],[]). inversa([X|Y],L) :- inversa(Y,Z), concatena(Z,[X],L). suma([],0). suma([X|Y],S):- suma(Y, Y1), S is Y1+X.

Ejercicio 13 El área de recursos humanos de un importante Club necesita obtener cierta información específica respecto a los aspirantes que se presentaron a un puesto de Guardavidas de la pileta. Durante las entrevistas de los aspirantes se tuvieron en cuenta los gustos de cada uno y si sabe nadar o no. La base de conocimiento está expresada en las siguientes tablas

Guía de prácticos Prolog

Página 31

Universidad Tecnológica Nacional FRC-Dpto. de Ing. en Sistemas de Información

Paradigmas de Programación 2013

A continuación se mencionan los nombres de los deportes que se pueden practicar en el club. Lista de deportes: atletismo, básquet, ciclismo, natación, equitación, fútbol, hándbol, remo,tenis y vóley. Se requiere conocer la siguiente información sobre los aspirantes: 1) Para cada aspirante, todos los deportes que se practiquen en el club y que le guste (sin incluir otras actividades que no sean deportes). Guía de prácticos Prolog

Página 32

Universidad Tecnológica Nacional FRC-Dpto. de Ing. en Sistemas de Información

Paradigmas de Programación 2013

2) Para cada aspirante, todas las demás actividades que les gustan (sin incluir los deportes que se practican en el club). 3) Consultar si algún aspirante en particular, no le gusta ninguno de los deportes que se practican en el club. 4) ¿Cuántos deportes se pueden practicar en el club? 5) Listado de los deportes que se pueden practicar en el club, ordenados ascendentemente (desde la A hasta la Z). 6) Consultar si algún aspirante en particular reúne los requisitos para ser un candidato al puesto. Para que un aspirante pueda ser candidato al puesto, debe cumplir mínimamente los siguientes requisitos: que sepa nadar, ó que le guste algún deporte de los que se practiquen en el club y que esté relacionado con alguna actividad acuática (si bien no todas esas actividades acuáticas sean realizadas en el club). El listado de las actividades acuáticas es: natación, remo, danza acuática y buceo.

%aspirante/1. aspirante('Sofía'). aspirante('María'). aspirante('Juan'). aspirante('Nico'). %leGusta/2. leGusta('Sofía','programar en Java'). leGusta('María','pintar'). leGusta('María','natación'). leGusta('María','tenis'). leGusta('Juan','cantar'). leGusta('Juan','fútbol'). leGusta('Juan','escuchar música'). leGusta('Nico','remo'). leGusta('Nico','fútbol'). %sabeNadar/1. sabeNadar('María'). sabeNadar('Nico'). %personasXDeporte/2. Punto 1) personasXDeporte(X,D):- aspirante(X), leGusta(X,D), member(D,['atletismo','básquet','ciclismo','natación','equitación','fútbol','hándbol','remo' ,'tenis','vóley']). %personasXOtrasActividades/2. Punto 2) personasXOtrasActividades(X,D):- aspirante(X), leGusta(X,D), \+(member(D,['atletismo','básquet','ciclismo','natación','equitación','fútbol','hándbol','re mo','tenis','vóley'])). %aXLeGustaAlgúnDeporte/1. Auxiliar para Punto 3) aXLeGustaAlgúnDeporte(X):aspirante(X),leGusta(X,D),member(D,['atletismo','básquet','ciclismo','natación','equitación' ,'fútbol','hándbol','remo','tenis','vóley']),!. %aXNoLeGustaNingúnDeporte/1. Punto 3) aXNoLeGustaNingúnDeporte(X):- not(aXLeGustaAlgúnDeporte(X)).

Guía de prácticos Prolog

Página 33

Universidad Tecnológica Nacional FRC-Dpto. de Ing. en Sistemas de Información

Paradigmas de Programación 2013

%cuántosDeportesSePracticanEnElClub/1 Punto 4) cuántosDeportesSePracticanEnElClub(N):length(['atletismo','básquet','ciclismo','natación','equitación','fútbol','hándbol','remo',' tenis','vóley'],N). %listadoDeDeportesOrdenados/1 Punto 5) listadoDeDeportesOrdenados(L):sort(['atletismo','básquet','ciclismo','natación','equitación','fútbol','hándbol','remo','te nis','vóley'],L). %candidato/1. Punto 6) candidato(X):- aspirante(X), (sabeNadar(X),!; leGusta(X,D), member(D,['atletismo','básquet','ciclismo','natación','equitación','fútbol','hándbol','remo' ,'tenis','vóley']), member(D,['natación','remo','danza acuática','buceo']),!).

Guía de prácticos Prolog

Página 34