UTNianos

Versión completa: Duda Prolog
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Necesito comprar 2 predicados, por ej:

gripe(dolor_de_cabeza).
gripe(tos).
gripe(congestion_nasal).

juan(dolor_de_cabeza).
juan(tos).
juan(congestion_nasal).
juan(cansancio).

Cómo haría un predicado que compare el paciente y la enfermedad y si tiene por lo menos 2 argumentos en común me devuelva True o False, ya probe de mucha formas pero la verdad estoy bastante perdido con este lenguaje, muchas gracias.
Me parece si pudieras hacer más clara tu duda estaría bueno, porque si es buscar algo en común entre ambos predicados podrías hacer:

tieneEnfermedad(Enfermedad) :- enfermedad(Enfermedad),juan(Enfermedad).

Ahora si esto no es lo que buscas realmente no te entiendo.

Saludos
Kaiko, pensá en el problema que tenés que resolver, no en cómo implementarlo.

"Un predicado que compare el paciente y la enfermedad y si tiene por lo menos 3 argumentos en común me devuelva True o False" suena a implementación. ¿Qué estás queriendo resolver?
(20-06-2014 12:20)Diego Pedro escribió: [ -> ]Me parece si pudieras hacer más clara tu duda estaría bueno, porque si es buscar algo en común entre ambos predicados podrías hacer:

tieneEnfermedad(Enfermedad) :- enfermedad(Enfermedad),juan(Enfermedad).

Ahora si esto no es lo que buscas realmente no te entiendo.

Saludos

mmm algo parecido la idea seria estaEnfermo(nombre,enfermedad) y que compare si tienen en comun hasta ahi todo bien, pero como hago que si tiene minimo en comun 2 de true y sino false? wall
gracias.

(20-06-2014 13:01)Desert69 escribió: [ -> ]Kaiko, pensá en el problema que tenés que resolver, no en cómo implementarlo.

"Un predicado que compare el paciente y la enfermedad y si tiene por lo menos 3 argumentos en común me devuelva True o False" suena a implementación. ¿Qué estás queriendo resolver?

te dejo una parte del enunciado capaz no fue my claro =P

Definir el predicado enfermoDe/2, que relaciona una persona con una enfermedad, una persona se enferma de dicha enfermedad si tiene al menos 2 síntomas de dicha enfermedad.
Esta bien ahí te entendí un toque mas. Lo primero que estás viendo mal es el argumento Nombre, si vos lo tenés planteado como lo escribiste, es decir juan(tos), entonces juan es un predicado, deberías tener algo así:

paciente(juan,tos)

Esto te relacionaría las dos cosas,de la forma en que vos lo pones en el primer post, es imposible ya que tu nombre no esta dado ni por un functor ni por argumento sino que es un predicado más, y después pensa de que forma podes agrupar esos datos, y sacar la cantidad (una pista, estaría muy bueno que uses orden superior).

A ver si con eso sale.

Saludos.

PD: Otra forma sin usar orden superior, sería fijandote si tiene dos sintomas distintos y con eso bastaría. Lo digo porque a veces se pueden hacer cosas sin recurrir al orden superior, digamos en este caso quizá sería usar una bazooka para matar una mosca
(20-06-2014 14:05)Diego Pedro escribió: [ -> ]PD: Otra forma sin usar orden superior, sería fijandote si tiene dos sintomas distintos y con eso bastaría. Lo digo porque a veces se pueden hacer cosas sin recurrir al orden superior, digamos en este caso quizá sería usar una bazooka para matar una mosca

That.
Al final me salio con un findall, creo que funciona bien.


estaEnfermoDe(Nombre,Enfermedad):- findall(Sintomas,(paciente(Nombre,Sintomas), sintomas(Enfermedad,Sintomas)),A), length(A,Z), Z>=2.


gracias a ambos por responder.
Si con un findall sale, pero era justamente lo que hablaba de matar una mosca con una bazooka =P
pasa que vos querias saber si un tipo tenia una enfermedad: true o false

ahora estas trayendo una lista de enfermedades para el tipo, son cosas distintas (no esta mal)
No, fijate que obtiene la lista pero busca su longitud. Nunca expone la lista hacia afuera del predicado.


Kaiko, ¿te animás a probar sin usar el findall?
URLs de referencia