Добавить список пользователей в атомы базы данных - PullRequest
0 голосов
/ 08 марта 2019

я пытаюсь использовать базу данных фактов болезни

symptom(shingles,headache).
symptom(shingles,fever).
symptom(shingles,malaise).
symptom(shingles,headache).
symptom(smallpox,fever).
symptom(smallpox,rash).

и сравнить ее со списком симптомов от пользователя.В настоящее время я могу получить симптомы от пользователя и добавить заболевание в список, однако не могу понять, как пройтись по базе данных entier, чтобы добавить все возможные заболевания.

start:-
    consult(diseases1),
    getSymptoms(Symptoms),
    write(Symptoms).

welcome:-
        write('Welcome to the Disease Diagnostic Center'),nl,nl.

getSymptoms(Symptoms) :-
    write('Please enter symptoms now, enter "Done" when finished: ' ),
    read_string(user, "\n", "\r", _, Response),
    (
        Response == "Done"
    ->
        Symptoms = []
    ;
        atom_string(Symptom,Response),
        valid_symptom(Symptom,Symptoms)

    ).

valid_symptom(Symptom,Symptoms) :-
(
    symptom(_,Symptom)
->
    getSymptoms(Symptoms0),
    foreach(symptom(Y,Symptom),write(Y))
;
    format('Invalid symptom: `~w''~n',[Symptom]),
    getSymptoms(Symptoms0),
    Symptoms = Symptoms0
).  

Итакнапример, пользователь вводит лихорадку в качестве одного из симптомов, тогда в списке должны быть гонт и оспа.В настоящее время я могу записать каждое возможное заболевание на экран, но я не уверен, чем заменить запись, чтобы иметь возможность добавлять каждое из них в список.

1 Ответ

0 голосов
/ 08 марта 2019

Если у вас есть список всех ваших заболеваний, вы можете отфильтровать его по конкретному симптому.

Все заболевания:

all_diseases(Diseases) :-
    setof(Disease, Symptom^symptom(Disease, Symptom), Diseases).

?- all_diseases(D).
D = [shingles, smallpox].

Затем отфильтруйте его:

require_symptom(Symptom, Diseases0, Diseases) :-
    setof(Disease,
          ( member(Disease, Diseases0),
            symptom(Disease, Symptom)),
          Diseases)
    *-> true
    ; Diseases = [].

?- all_diseases(Ds), require_symptom(headache, Ds, D1).
Ds = [shingles, smallpox],
D1 = [shingles].

?- all_diseases(Ds), require_symptom(fever, Ds, D1).
Ds = D1, D1 = [shingles, smallpox].

?- all_diseases(Ds), require_symptom(vomiting, Ds, D1).
Ds = [shingles, smallpox],
D1 = [].

Вывод списка до и после его фильтрации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...