Autor Tema: Saber si una persona es obsesiva en Prolog

0 Usuarios y 1 Visitante están viendo este tema.

28 Julio, 2023, 07:28 am
Leído 541 veces

manooooh

  • $$\Large \color{#9c57a6}\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 4,791
  • País: ar
  • Karma: +1/-0
  • Sexo: Masculino
Hola!

Tengo la siguiente base de conocimientos en un archivo .pl:

Código: [Seleccionar]
% persona(Nombre)
persona(mario).
persona(leandro).
persona(victoria).
persona(marcela).
persona(gabriela).
persona(camila).
persona(horacio).

% comun(Persona, Producto, PrecioFinal, Cantidad)
comun(mario, sobre_carta, 100, 1).
comun(mario, cinta_scotch, 50, 3).

comun(leandro, sobre_carta, 200, 5).

comun(victoria, clips, 150, 30).
comun(victoria, sobre_carta, 120, 3).

comun(marcela, clips, 140, 20).
comun(marcela, clips, 550, 50).

comun(gabriela, clips, 5, 10).

% granel(Persona, Producto, PrecioFinal)
granel(gabriela, vaso_plastico, 50).

% especial(Persona, Producto, PrecioFinal, Proteccion)
especial(leandro, resmaA4, 1500, noProtegida).

% departamento(Persona, Departamento)
departamento(mario, contaduria).
departamento(victoria, contaduria).

departamento(gabriela, facturacion).
departamento(horacio, facturacion).

departamento(camila, sistemas).
departamento(leandro, sistemas).

departamento(marcela, rrhh).

% precioUnitario(Producto, PrecioUnitario)
precioUnitario(cinta_scotch, 25).
precioUnitario(clips, 5).
precioUnitario(sobre_carta, 50).
precioUnitario(resmaA4, 1500).

Me piden saber si una persona es obsesiva, que sucede cuando compró al menos un producto y lo único que compra siempre es el mismo producto.

Nota: El predicado debe ser totalmente inversible. Marcela es obsesiva con los clips.

Nota 2: No se puede utilizar findall, ni setOf ni aggregate.




Mi intento fue definir el predicado esObsesiva/1 sin éxito:

Código: [Seleccionar]
esObsesiva(Persona) :-
   comproAlMenosUnProducto(Persona),
   comproAlMenosUnProducto(OtraPersona),
   forall(comproAlMenosUnProducto(Persona), comproElMismoProducto(Persona, OtraPersona)).

comproAlMenosUnProducto(Persona) :- comun(Persona, _, _, _).
comproAlMenosUnProducto(Persona) :- granel(Persona, _, _).
comproAlMenosUnProducto(Persona) :- especial(Persona, _, _, _).

comproElMismoProducto(UnaPersona, OtraPersona) :-
   comun(UnaPersona, Producto, _, _),
   comun(OtraPersona, Producto, _, _).

comproElMismoProducto(UnaPersona, OtraPersona) :-
   granel(UnaPersona, Producto, _),
   granel(OtraPersona, Producto, _).

comproElMismoProducto(UnaPersona, OtraPersona) :-
   especial(UnaPersona, Producto, _, _),
   especial(OtraPersona, Producto, _, _).

Al consultar en consola por:

Código: [Seleccionar]
?- esObsesiva(Persona).
Me arroja todos los resultados (y duplicados muchas veces):

Código: [Seleccionar]
Persona = mario ;
Persona = mario ;
Persona = mario ;
Persona = mario ;
Persona = mario ;
Persona = mario ;
Persona = mario ;
Persona = mario ;
Persona = mario ;
Persona = mario ;
Persona = mario ;
Persona = mario ;
Persona = leandro ;
Persona = leandro ;
Persona = leandro ;
Persona = leandro ;
Persona = leandro ;
Persona = leandro ;
Persona = victoria ;
Persona = victoria ;
Persona = victoria ;
etc..................

No sé si interpreté mal cómo dar estructura a los hechos o si estoy haciendo mal los predicados ???.

Gracias!!
Saludos

31 Julio, 2023, 08:30 pm
Respuesta #1

manooooh

  • $$\Large \color{#9c57a6}\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 4,791
  • País: ar
  • Karma: +1/-0
  • Sexo: Masculino
Hola

¿Alguna orientación?

Saludos

EDIT. No sé si los resultados que arrojan son fiables, pero si el enunciado dice que una persona "compró al menos un producto", si sólo compró 1 producto, por definición es obsesiva, ya que lo único que compró es el mismo producto. Quizás haya que entender "al menos dos productos".