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
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