hermano_de
y tio_de
Escribir las siguientes oraciones en Prolog:
es_valioso(oro).
es_mujer(isabel).
es_rey(juan).
es_progenitor_de(zeus, hercules).
le_presta_dinero(jose, pedro).
Escribir en Prolog los datos relevantes, (a los efectos genealógicos), del siguiente párrafo: “La familia de Luis no es muy numerosa, sus padres, Carlos y Susana, tuvieron tres hijos: Roberto, Amalia, y Luis, de los cuales Luis es el menor. Carlos, a su vez, tiene una hermana mayor llamada Isabel, siendo ambos hijos de Ana y Guillermo. Los padres de Susana, Mercedes y Ernesto, tuvieron otra hija bastante menor que ella, a quien bautizaron con el nombre de Angélica, la que es tan bella como su nombre. Los dos hijos de Luis y su esposa Laura, llamados Federico y Carla, están estudiando letras”. Utilizar solamente los predicados “es_progenitor_de”, “es_varon” y “es_mujer”.
% Definición del predicado padre
padre(X, Y) :- es_progenitor_de(X, Y), es_varon(X).
% familia carlos y susana
es_progenitor_de(carlos,roberto).
es_progenitor_de(carlos,amalia).
es_progenitor_de(carlos,luis).
es_progenitor_de(susana,roberto).
es_progenitor_de(susana,amalia).
es_progenitor_de(susana,luis).
% familia luis y laura
es_progenitor_de(luis, federico).
es_progenitor_de(luis, carla).
es_progenitor_de(laura, federico).
es_progenitor_de(laura, carla).
% familia ana y guillermo
es_progenitor_de(guillermo, carlos).
es_progenitor_de(guillermo, isabel).
es_progenitor_de(ana, carlos).
es_progenitor_de(ana, isabel).
% familia ernesto y mercedes
es_progenitor_de(ernesto, angelica).
es_progenitor_de(ernesto, susana).
es_progenitor_de(mercedes, angelica).
es_progenitor_de(mercedes, susana).
%genero
es_varon(carlos).
es_varon(roberto).
es_varon(luis).
es_varon(federico).
es_varon(guillermo).
es_varon(ernesto).
es_mujer(amalia).
es_mujer(susana).
es_mujer(laura).
es_mujer(carla).
es_mujer(mercedes).
es_mujer(angelica).
Usando la base de datos generada en el problema de la familia de Luis, y con lo que se conoce hasta ahora, escribir consultas para obtener la siguiente información: Preguntas simples:
?- es_progenitor_de(carlos, guillermo).
?- es_progenitor_de(jorge, gonzalo).
?- es_progenitor_de(carlos, amalia).
% Definición del predicado padre
padre(X, Y) :- es_progenitor_de(X, Y), es_varon(X).
% Consulta
?- padre(carlos, roberto).
?- es_mujer(gonzalo)
?- es_hombre(alberto)
Preguntas compuestas (conjunciones):
?- es_progenitor_de(luis,carla), es_mujer(carla)
de Luis, y a su vez Luis es progenitor de Carla?
?- es_progenitor_de(ernesto,carlos), es_progenitor_de(carlos,luis),
es_progenitor_de(luis,carla)
Usando la base de datos generada en el problema de la familia de Luis, y con lo que se conoce hasta ahora, escribir consultas para obtener la siguiente información:
?- es_progenitor_de(federico, Hijo).
?- es_progenitor_de(Progenitor, roberto).
Progenitor = carlos
Progenitor = susana
?- es_progenitor_de(guillermo, X), es_mujer(X)
false
es_progenitor_de(carlos, X), es_mujer(X)
X = amalia
false
D. ¿Ernesto tuvo algún hijo varón?
?- es_progenitor_de(guillermo, X), es_mujer(X)
false
E. ¿Roberto y Amalia tienen el mismo padre?
?- es_progenitor_de(Padre, roberto), es_progenitor_de(Padre, amalia)
Padre = carlos
F. ¿Ernesto tuvo alguna hija que a su vez tenga una hija?
es_progenitor_de(ernesto, Hija), es_progenitor_de(Hija, Nieta), es_mujer(Nieta).
Hija = susana,
Nieta = amalia
La hija es Susana, la hija mujer de Susana es Amalia
Definir un predicado que relacione una temperatura expresada en grados Celsius con la misma temperatura expresada en grados Farenheit. Recordamos que F = (9/5) * C + 32
% Definición del predicado celsius_a_fahrenheit
celsius_a_fahrenheit(C, F) :-
F is (9/5) * C + 32.
?- celsius_a_fahrenheit(1, F).
F = 33.8
Definir un predicado que relacione una longitud expresada en centímetros, con la misma longitud expresada en pulgadas, pies y yardas. Recordamos que: 1 yarda = 3 pies 1 pie = 12 pulgadas 1 pulgada = 2.54 centímetros
longitud(Cm, Pulgadas, Pies, Yardas) :-
Pulgadas is (Cm/2.54),
Pies is (Pulgadas/12),
Yardas is (Pies/3).
?- longitud(100, Pulgadas, Pies, Yardas)
Pies = 21.166666666666668,
Pulgadas = 254.0,
Yardas = 7.055555555555556
Una empresa de ventas paga a sus empleados un salario fijo de 800 pesos, mas una comisión de $50 por cada venta realizada, más el 8% sobre el monto total de ventas. Escribir la regla de un predicado ternario que vincule la cantidad de ventas, con el monto total de ventas y el sueldo del vendedor.
sueldo(Ventas, MontoTotalVentas, Sueldo) :-
SalarioFijo is 800,
ComisionPorVenta is 50,
PorcentajeComision is 0.08,
% monto total de comisiones
TotalComisiones is Ventas * ComisionPorVenta + MontoTotalVentas * PorcentajeComision,
% sueldo total
Sueldo is SalarioFijo + TotalComisiones.
?- sueldo(10, 2000000, Sueldo).
Sueldo = 161300.0
Definir un predicado que vincule las notas de cuatro parciales con la nota promedio.
promedio(Nota1,Nota2, Nota3, Nota4, Promedio) :-
SumaNotas is Nota1 + Nota2 + Nota3 + Nota4,
Promedio is (SumaNotas/4).
?- promedio(2,2,10,3, Promedio)
Promedio = 4.25
Una empresa tiene 5 gerentes, 23 empleados administrativos y 7 ordenanzas. Preparar un predicado que vincule el sueldo de cada categoría con el total que la empresa debe pagar a fin de mes.
pagoFinal(SueldoGerente, SueldoAdministrativo, SueldoOrdenanza, PagoFinal):-
SubtotalGerente is SueldoGerente * 5,
SubtotalAdministrativo is SueldoAdministrativo * 23,
SubtotalOrdenanza is SueldoOrdenanza * 7,
PagoFinal is SubtotalGerente + SubtotalAdministrativo + SubtotalOrdenanza.
?- pagoFinal(650000, 450000, 800000, PagoFinal)
PagoFinal = 19200000
Un millonario excéntrico tenía tres hijos Carlos, José’ y Marta. Al morir dejó el siguiente legado: “A José le dejo 4/3 de lo que le dejo a Carlos; a Carlos le dejo 1/3 de mi fortuna y a Marta le dejo la mitad de lo que le dejo a José”. Preparar un predicado que vincule la suma a repartir con lo que le toca a cada uno.
herencia(HerenciaCarlos, HerenciaJose, HerenciaMarta, HerenciaTotal):-
HerenciaCarlos is (HerenciaTotal / 3),
HerenciaJose is (4/3) * HerenciaCarlos,
HerenciaMarta is (1/2) * HerenciaJose.
?- herencia(HerenciaCarlos, HerenciaJose, HerenciaMarta, 1000000).
HerenciaCarlos = 333333.3333333333,
HerenciaJose = 444444.4444444444,
HerenciaMarta = 222222.2222222222
En un negocio se desea armar una oferta para fin de año combinando un artículo de bazar, uno de perfumería y uno de juguetería, con la condición de que la oferta no supere un cierto precio máximo. Para ello contamos con la siguiente base de datos:
bazar(fuentes).
bazar(vasos)
bazar(juego_de_café).
perfumeria(jabones).
perfumeria(crema).
perfumeria(perfume).
perfumeria(autito).
perfumeria(muñeca).
perfumeria(oso).
precio(fuentes, 15).
precio(vasos, 12).
precio(juego_de_café, 20).
precio(jabones, 10).
precio(crema, 15).
precio(perfume, 25).
precio(autito, 10).
precio(muñeca, 15).
precio(oso, 20).
Escribir una regla “oferta” que relacione tres artículos, uno de cada rubro, con el precio máximo, y que sea verdadero cuando la oferta no supere el precio máximo.
% Regla para verificar la oferta
oferta(ArticuloBazar, ArticuloPerfumeria, ArticuloJugueteria, PrecioMax) :-
bazar(ArticuloBazar),
perfumeria(ArticuloPerfumeria),
jugueteria(ArticuloJugueteria),
precio(ArticuloBazar, PrecioBazar),
precio(ArticuloPerfumeria, PrecioPerfumeria),
precio(ArticuloJugueteria, PrecioJugueteria),
Total is PrecioBazar + PrecioPerfumeria + PrecioJugueteria,
Total =< PrecioMax.
Hacer una consulta para encontrar todas las ofertas de menos de $50.
?- ofertas_bajo_cincuenta(ArticuloBazar, ArticuloPerfumeria, ArticuloJugueteria).
ArticuloBazar = fuentes,
ArticuloJugueteria = autito,
ArticuloPerfumeria = jabones
ArticuloBazar = fuentes,
ArticuloJugueteria = muneca,
ArticuloPerfumeria = jabones
...
...
hermano_de
y tio_de
La siguiente es la descripción de la familia Adams:
padre_de(homero, pericles).
padre_de(homero, merlina).
padre_de(desconocido, lucas).
padre_de(desconocido, homero).
varon(homero).
varon(lucas).
varon(cosa).
varon(pericles).
mujer(merlina).
mujer(morticia).
mujer(la-abuela).
madre(la-abuela, homero).
esposos(morticia, homero).
hermano_de
.hermano_de(X, Y) :-
padre_de(Padre, X),
padre_de(Padre, Y),
X \= Y.
?- tio(Quien,merlina).
:
tio(Tio, Sobrino) :-
hermano_de(Tio, PadreMadre),
padre_de(PadreMadre, Sobrino),
varón(Tio).
?- tio(Quien, merlina).
Quien = lucas
Se tiene la siguiente base de datos con ciudades vecinas y las rutas que las conectan:
conectadas(arrecifes, san_antonio_de_areco, ruta_8).
conectadas(san_antonio_de_areco, cardales, ruta_8).
conectadas(carmen_de_areco, san_andres_de_giles, ruta_7).
conectadas(san_andres_de_giles, lujan, ruta_7).
conectadas(cardales, lujan, ruta_6).
conectadas(san_antonio_de_areco, san_andres_de_giles, ruta_41).
conectadas(san_andres_de_giles, mercedes, ruta_41).
conectadas(arrecifes, carmen_de_areco, ruta_51).
conectadas(carmen_de_areco, chivilcoy, ruta_51).
conectadas(lujan, mercedes, ruta_5).
conectadas(mercedes, chivilcoy, ruta_5).
siguiente(X, Y, Z) :- conectadas(Y, X, Z).
Escribir las siguientes consultas:
Si, mediante la ruta 41
% Consulta directa
?- conectadas(san_antonio_de_areco, san_andres_de_giles, Ruta)
Ruta = ruta_41
% Consultar todas las ciudades conectadas
?- conectadas(san_antonio_de_areco, Ciudad, _)
Ciudad = cardales,
Ciudad = san_andres_de_giles,
?- conectadas(chivilcoy, Ciudad, Ruta)
false
?- conectadas(chivilcoy, san_antonio_de_areco, Ruta)
false
?- conectadas(san_antonio_de_areco, chivilcoy, Ruta)
false
?- conectadas(carmen_de_areco, san_andres_de_giles, ruta_51)
false
?- conectadas(lujan, Ciudad, _); conectadas(Ciudad, lujan, _).
Ciudad = mercedes
Ciudad = san_andres_de_giles
Ciudad = cardales
?- conectadas(san_andres_de_giles, Ciudad, Ruta)
Ciudad = lujan,
Ruta = ruta_7
Ciudad = mercedes,
Ruta = ruta_41
?- conectadas(Ciudad, san_andres_de_giles, Ruta)
Ciudad = carmen_de_areco,
Ruta = ruta_7
Ciudad = san_antonio_de_areco,
Ruta = ruta_41
conectadas_con_san_andres_de_giles(Ciudad) :-
conectadas(san_andres_de_giles, Ciudad, _);
conectadas(Ciudad, san_andres_de_giles, _).
?- conectadas_con_san_andres_de_giles(Ciudad).
Ciudad = lujan
Ciudad = mercedes
Ciudad = carmen_de_areco
Ciudad = san_antonio_de_areco
IMPORTANTE: el lugar que tome Lujan como parámetro es importante para la G y H.
?- conectadas(_, lujan, Ruta)
Ruta = ruta_7
Ruta = ruta_6
?- conectadas(lujan, _, Ruta)
Ruta = ruta_5
% Si nos interesa saber la/s ciudad/es:
?- conectadas(lujan, Ciudad, Ruta)
Ciudad = mercedes,
Ruta = ruta_5
?- conectadas(carmen_de_areco, san_andres_de_giles, _), conectadas(san_andres_de_giles, lujan, _).
true
¿Por qué _
devuelve true o false?
Cuando usas _
, Prolog solo está verificando si las conexiones existen, sin preocuparse por el valor de las rutas. Si las conexiones son válidas, devuelve true. Si no lo son, devuelve false.
?- conectadas(lujan, mercedes, _), conectadas(mercedes, chivilcoy, Ruta)
Ruta = ruta_5
✍️ Autor: Emilio Giordano
🔗 Más resúmenes de Programación Declarativa en el repositorio