UTNianos

Versión completa: [PdeP] ¿Por qué no funciona?
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Buenas noches compañeros! Cómo andán?

Tengo una consulta sobre el paradigma lógico. No entiendo por qué no funciona lo siguiente:


enfermedad(gripe,aguda, virus, [congestionNasal,dolorDeCabeza,tos]).
enfermita(juan, [tos]).

sintomsof(A,X):-enfermedad(A, _, _, X).
enfermoDe(N, Ill):- sintomsof(Ill, R1|R1c), enfermita(N, R2|R2c), member(R1,R2|R2c).

Esta consulta arroja False, pero ahora cuando yo consulto directamente de esta manera, arroja True.

35 ?- member(tos,[congestionasal,dolordecabeza,tos]).
true.


Hay algo que no estoy viendo? Algún error?

Desde ya, les agradezco por la ayuda!!!
Buen fin de semana!
1) Trabaja en la expresividad, que es A, que es X?
2) 35 ?- member(tos,[congestionasal,dolordecabeza,tos]).
true.

Esto te tira "true" por que member se usa para saber si ese primero se incluye en la lista del segundo miembro dicho en castellano ja
3) que consulta te arroja false?
Adhiero a lo que dice Caro, intentá ponerle nombres más expresivos a las variables (Nombre, Persona, Sintomas, Enfermedad, etcetc) y a los predicados. Si te lo lee un profesor así, dudo mucho que le caiga bien =P

Sobre lo del false, chequeaste que no te falte ligar alguna variable? A veces ese es el problema.
Esta mal, estas preguntando si congestionNasal esta en [tos], por eso te tira false.

No se que queres lograr, pero cuando queres fijarte si una o algunas cosas de una lista yo siempre hacia
findall(Cosa, (member(Cosa,Lista1), member(Cosa,Lista2)), CosasEnComun),
CosasEnComun != [].
Vamos a lo concreto: member te arroja true porque estás buscando "tos" en la lista que pusiste después, donde también está "tos".


¿Tenés a mano el enunciado? sería mucho más simple para fijarse y de ser necesario elaborar alternativas.
Respondiendo concretamente a tu pregunta, como te dijo sarasa estás haciendo la consulta al revés, deberías invertir las listas, o sea member(R2,R1|R1c), o en su defecto, deberías haber preguntado ?- member(congestionasal,[tos]). , y ahí si te respondería false, básicamente eran consultas distintas, por eso arrojaban diferentes resultados.

Al margen de ese problema, tené en cuenta lo de los nombres, por ahí acá lo hiciste rápido porque querías poner un ejemplo de tu problema, no pasa nada, ponele que como mucho se complica a la hora de ayudarte, pero en tps o parciales te asesinan por hacer eso, y estando en pc conviene acostumbrarse a hacerlo bien de una, por más que estés probando. Por ejemplo sintomsof(A,X) no tengo idea que hace, en cambio sintomas(Enfermedad,Sintomas) es mucho más claro.

Y algo más importante todavía, no sé que intentabas hacer, pero tené en cuenta que en lo que pasaste preguntás si el primer elemento de la lista de síntomas de una enfermedad pertenece a la lista de síntomas de la persona, cuando probablemente lo que necesitabas ver es si ALGUNO de los síntomas, o si TODOS los síntomas de una lista pertenece a la otra lista de síntomas. Pero habría que ver el enunciado para saber exactamente que es lo que pedía.
Este es el enunciado.
Doctor Online
[functores, hechos, reglas, predicados ]
Un grupo de médicos con gran espíritu altruista, están muy interesados en ayudar a la humanidad. Para esto nos piden un sistema que los ayude tanto tanto en el diagnóstico de enfermedades como en el tratamiento de las mismas.

Definir la base de conocimiento teniendo en cuenta la siguiente información:
Las enfermedades las clasificamos según su duración, pueden ser agudas o crónicas, las agudas están representada por un nombre y por qué está causada (virus o bacteria) y las crónicas además de lo anterior por la cantidad de años que la tiene.
La gripe es una enfermedad aguda causada por virus y tiene como síntomas congestión nasal, dolor de cabeza y tos.
La meningitis es aguda y puede estar causada por virus o bacterias. En cuanto a los síntomas de la meningitis se conoce fiebre, vómitos, dolor de cabeza.
La tuberculosis es una enfermedad aguda causada por una bacteria con síntomas como cansancio, tos, sudoración.
La enfermedad pulmonar obstructiva crónica (epoc) está causada tanto por virus como bacterias y tiene síntomas como disnea, que aparece entre el quinto y el décimo año, y tos, que aparece entre el primer y tercer año.
analia tiene dolor de cabeza, congestión nasal y cansancio.
jorge tiene somnolencia, cansancio y disnea.
nadia tiene fiebre, dolor de cabeza y congestión nasal.
juan tiene tos.
la tos se alivia con jarabe.
el cansancio se alivia con vitaminas.
el paracetamol alivia tanto la fiebre como el dolor de cabeza.
La disnea se alivia con broncodilatadores.

Se pide:
Realizar las consultas que permita conocer para una enfermedad qué síntomas produce.
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.
Definir el predicado tratar/2 relaciona una enfermedad y un medicamento que sirve para aliviar algún síntoma de dicha enfermedad.
Definir el predicado sugerir/2, que relaciona una persona con un medicamento siempre y cuando este ayude a aliviar la enfermedad que contrajo la persona.
Definir el predicado bacteriana/1 que recibe una enfermedad y es bacteriana si es causada por bacterias.
Se agrega lo siguiente a la base de conocimiento:
enfermero(martha).
doctor(foreman, neurologo).
doctor(house, nefrologia).

Definir el predicado loPuedeAtender/3 que dado una persona, una enfermedad y un profesional de la salud nos permite saber si éste puede atender a la persona, los pueden atender si la persona está enferma y además:

Si son enfermeros sólo si la enfermedad del paciente es aguda.
Si son doctores atienden sólo a pacientes con enfermedades bacterianas o si son crónicas con más de 5 años.

La joda con este ejercicio es que no es muy explicito, ya que las enfermedades hay que armarlas por ejemplo de la siguiente manera:

aguda(gripe,virus).

cronica(epoc,virus,_).
cronica(epoc,bacteria,_).

sintomas(aguda(gripe,virus),congestionNasal).
sintomas(aguda(gripe,virus),dolorDeCabeza).
sintomas(aguda(gripe,virus),tos).


Esto es solo para las enfermedades, es asi ya que en mi curso ya lo revisamos y se hace asi. =D En el caso de que no quieras usar la expresividad vas a tener que comentar como un loco(casi hacer un libro de lo que quieren decir tus funciones o predicados como en este caso). No te puedo ayudar mucho mas sino te hago el ejercicio, solo te puedo decir que te la complicaste al pepe, sin embargo si lo que te puse yo no lo entendiste, uso el razonamiento tuyo se puede hacer.

enfermedad(Enfermedad,Duracion,VirusOBacteria,ListaDeSintomas).
paciente(Paciente,ListaDeSintomasDelPaciente).

enfermoDe(Persona,Enfermedad):-
paciente(Persona,[Sintoma1|Sintoma2|OtrosSintomas]),
enfermedad(Enfermedad,_,_,ListaDeSintomas),
member(Sintoma1,ListaDeSintomas),
member(Sintoma2,ListaDeSintomas).
Bueno, primero que nada, pensá que resolver un exámen del paradigma lógico depende PURA Y EXCLUSIVAMENTE de la base de conocimiento que armás, así que tené mucho cuidado armandola.

Si bien lo de AGUDA y CRONICA está bien definido, yo tendría cuidado en la parte de síntomas, donde la parte del agente de la enfermedad ni lo mencionaría para que la enfermedad este solamente relacionada con el sintoma y punto. Ejemplos importantes:

sintoma(esAguda(gripe, _), congestionNasal).
sintoma(esAguda(gripe, _), dolorCabeza).
sintoma(esAguda(gripe, _), tos).
sintoma(esCronica(epoc, _, años), disnea):- (años >= 5), (años =< 10).
sintoma(esCronica(epoc, _, años), tos):- (años >= 1), (años =< 3).


En el ejemplo de los pacientes, yo haría algo como esto, porque armar una lista en la base de conocimiento huele peligroso:

persona(juan, sintoma(_, tos)).

(y así con cada sintoma que tuviese)

Analicemos lo siguiente: en el predicado enfermoDe, tenés que buscar todos los sintomas (hello, findall) que posee una persona para una enfermedad (si chequeas la base de conocimiento, hay siempre al menos 2, así que no habrá nada contradictorio), y verificar que sean 2 al menos. Por lo que mi propuesta sería
1- Genero todos los sintomas para esa enfermedad (garantizar inversibilidad es importante).
2- Armo una lista que exprese todos los sintomas que cumplan la condición (el paciente enfermo con esa enfermedad, saco su sintoma...).
3- Arme una interesante lista en el findall, luego entonces reviso si el tamaño de la lista es mayor o igual a 2.




Fijate si te sale, y sino seguí preguntando. Traté de no pasarte ninguna respuesta para que lo maquines un poco, pero si estás muy perdido avisá y en un "plan Z" te lo paso (lo tengo en un txt que armé en la máquina pensandolo de puro gusto). Total, si nunca entendiste nada de las clases, esto si te salva lo hace en un 0,5% =P

¡Éxitos!
;)
URLs de referencia