programacion - ¿Cómo aplicar el cuantificador universal en Prolog?
paradigma logico que es (2)
Bueno, probablemente exista una manera mucho más simple de hacer esto, ya que mis habilidades de Prolog son menores en el mejor de los casos.
has_disease(Person, Disease) :- atom(Disease),
findall(Symptom, has_symptom(Person, Symptom), PersonSymptoms),
findall(DSymptom, causes_of(DSymptom, Disease), DiseaseSymptoms),
subset(DiseaseSymptoms, PersonSymptoms).
has_diseases(Person, Diseases) :-
findall(Disease, (causes_of(_, Disease), has_disease(Person, Disease)), DiseaseList),
setof(Disease, member(Disease, DiseaseList), Diseases).
Para ser llamado de la siguiente manera:
?- has_diseases(person1, D).
D = [disease1, disease2, disease3].
El predicado findall/3
se usa primero para encontrar todos los síntomas que tiene una persona, luego nuevamente para encontrar todos los síntomas que tiene una enfermedad, luego una comprobación rápida para ver si los síntomas de la enfermedad son un subconjunto de la persona.
La forma en que escribí el predicado has_disease/2
evita que proporcione una lista de enfermedades. Así que creé has_diseases/2
, que realiza otro findall
sobre cualquier enfermedad que pueda encontrar, usando has_disease/2
como chequeo. Una llamada setof/3
se utiliza por última vez para obtener resultados únicos en la lista de enfermedades y solicitarla por conveniencia.
NÓTESE BIEN. El atom/1
en la primitiva has_disease/2
es solo para asegurar que no se pase una variable por Disease
, ya que no funciona en ese caso, al menos no para mí.
Supongamos que tiene un programa Prolog de diagnóstico de enfermedades que comienza con muchas relaciones entre enfermedades y síntomas:
causes_of(symptom1, Disease) :-
Disease = disease1;
Disease = disease2.
causes_of(symptom2, Disease) :-
Disease = disease2;
Disease = disease3.
causes_of(symptom3, Disease) :-
Disease = disease4.
has_symptom(person1, symptom1).
has_symptom(person1, symptom2).
¿Cómo puedo crear una regla con la cabecera ''has_disease (Person, Disease)'' que devuelva verdadero si la persona tiene todos los síntomas de esa enfermedad? Usando el ejemplo anterior, lo siguiente sería un resultado de muestra:
has_disease(person1, Disease).
Disease = disease2.
Necesitará una forma de consultar todos los síntomas, p. Ej., Con findall(S,cause_of(S,disease),SS)
, donde SS
será la lista de síntomas para esta enfermedad.