system_doradzwa_medycznego_.../medical_adviser.pl

183 lines
7.0 KiB
Perl
Raw Normal View History

% | ======================= |
% | == disease data base == |
% | ======================= |
2021-06-13 21:16:24 +02:00
disease("flu",[("pain",["throat"]),("runny nose"),("fever",-1),("general weakness"),("coughs")],[("pain",["muscles"])]).
disease("malaria",[("fever",2),("general weakness")],[("pain",["head"]),("chills"),("erythrocyte",-1)]).
2021-06-13 21:16:24 +02:00
disease("angina",[("fever",2),("coughs"),("general weakness"),("magnifying lymph nodes"),("pain",["throat"])],[("cannot swallow"),("pain",["head"]),("chills")]).
disease("diphtheria",[("fever",1),("general weakness"),("dyspnea")],[("Unclear Speech"),("cannot swallow")]).
2021-06-13 21:16:24 +02:00
disease("typhoid",[("fever",0),("pain",["stomach"]),("spleen enlargement")],["tire symptoms"]).
disease("plague",[("fever",2),("general weakness"),("magnifying lymph nodes"),("liver enlargement"),("spleen enlargement")],[("cloded rash")]).
2021-06-13 21:16:24 +02:00
disease("haemophilia",[("epistaxis"),("impaired blood clotting"),("spleen enlargement")],[("fever",0),("fever",1),("fever",2)]).
disease("whooping cough",[("fever",1),("pain",["throat"]),("paroxysmal cough")],[("conjunctivitis"),("vomits")]).
disease("myasthenia",[("excessive fatigue")],[("muscle weakness"),("double vision"),("fever",0),("fever",1),("fever",2)]).
disease("atrial fibrillation",[("dizziness"),("faints"),("excessive fatigue")],[("coughs"),("fever",1),("fever",2),("fever",3)]).
% | ===================== |
% | == main procedures == |
% | ===================== |
diagnose(Sentence, Answer) :-
interpret(Sentence, Symptoms),
suggest(Symptoms, Answer).
2021-06-13 21:16:24 +02:00
% | ============================= |
% | == data parsing procedures == |
% | ============================= |
% | = interprete input = |
interpret(Input, Symptoms) :-
split_string(Input, ".", " ", Splited),
iterate(Splited,A),
flatten(A, Symptoms).
% | = auxiliary procedures = |
envelop([X], [Z]):-
Z=(X).
envelop([X|Xs], [Z|Zs]) :-
Z=(X),
envelop(Xs,Zs).
2021-06-13 21:25:03 +02:00
envelopPain([X], [Z]):-
Z=("pain",[X]).
envelopPain([X|Xs], [Z|Zs]) :-
Z=("pain",[X]),
envelopPain(Xs,Zs).
2021-06-13 21:16:24 +02:00
iterate([_], []).
iterate([X|Xs], [Z|WithoutLast]) :-
(sub_string(X,_,_,_,"Patient has ")->string_length(X,AA),L is AA-12, sub_string(X,12,L,_,AAA), split_string(AAA, ",", " ", AAAA),envelop(AAAA,Z);
(sub_string(X,_,_,_,"Patient ")->string_length(X,AA),L is AA-8, sub_string(X,8,L,_,AAA), split_string(AAA, ",", " ", AAAA),envelop(AAAA,Z);
(sub_string(X,_,_,_,"Patients erythrocyte level is ")->string_length(X,AA),L is AA-30, sub_string(X,30,L,_,AAA), re_replace(",",".",AAA,AAAA), number_string(VAL,AAAA), (VAL>4.2->(VAL>5.4->Z=("erythrocyte",1);Z=("erythrocyte",0));Z=[("erythrocyte",-1)]);
(sub_string(X,_,_,_,"Patients temperature is ")->string_length(X,AA), sub_string(X,24,4,_,AAA), re_replace(",",".",AAA,AAAA), number_string(VAL,AAAA), (VAL>37.0->(VAL>38.0->Z=("fever",2);Z=("fever",1));Z=[("fever",0)]);
2021-06-13 21:25:03 +02:00
(sub_string(X,_,_,_,"Patients ")->string_length(X,AA),L is AA-15, sub_string(X,9,L,_,AAA), split_string(AAA, ",", " ", AAAA), envelopPain(AAAA,Z);Z="cannot interprete"))))),
2021-06-13 21:16:24 +02:00
iterate(Xs, WithoutLast).
% | ==================================== |
% | == disease recognizing procedures == |
% | ==================================== |
% | = auxiliary procedures = |
includesAll(_, []) :- true, !.
includesAll(List, [Inhd|Intl]) :- member(Inhd, List), includesAll(List, Intl), !.
includesAny(_, []) :- false, !.
includesAny(List, [Inhd|Intl]) :- member(Inhd, List); includesAny(List, Intl), !.
checkForDiseaseStrong(Symptoms, Disease) :-
disease(Disease, ObligatorySymptoms, AdditionalSymptoms),
append(ObligatorySymptoms, AdditionalSymptoms, ExpectedSymptoms),
includesAll(Symptoms, ObligatorySymptoms),
includesAll(ExpectedSymptoms, Symptoms),
!.
checkForDiseaseWeak(Symptoms, Disease) :-
disease(Disease, ObligatorySymptoms, AdditionalSymptoms),
append(ObligatorySymptoms, AdditionalSymptoms, ExpectedSymptoms),
not(checkForDiseaseStrong(Symptoms, Disease)),
includesAny(Symptoms, ExpectedSymptoms),
includesAll(ExpectedSymptoms, Symptoms),
!.
% | = suggest procedure = |
% flu
suggest(Symptoms, Answer) :-
checkForDiseaseStrong(Symptoms, "flu"),
Answer = "The patients disease is almost certainly flu.".
suggest(Symptoms, Answer) :-
checkForDiseaseWeak(Symptoms, "flu"),
Answer = "The patients disease might be flu.".
% malaria
suggest(Symptoms, Answer) :-
checkForDiseaseStrong(Symptoms, "malaria"),
Answer = "The patients disease is almost certainly malaria.".
suggest(Symptoms, Answer) :-
checkForDiseaseWeak(Symptoms, "malaria"),
Answer = "The patients disease might be malaria.".
% angina
suggest(Symptoms, Answer) :-
checkForDiseaseStrong(Symptoms, "angina"),
Answer = "The patients disease is almost certainly angina.".
suggest(Symptoms, Answer) :-
checkForDiseaseWeak(Symptoms, "angina"),
Answer = "The patients disease might be angina.".
% diphtheria
suggest(Symptoms, Answer) :-
checkForDiseaseStrong(Symptoms, "diphtheria"),
Answer = "The patients disease is almost certainly diphtheria.".
suggest(Symptoms, Answer) :-
checkForDiseaseWeak(Symptoms, "diphtheria"),
Answer = "The patients disease might be diphtheria.".
% typhoid
suggest(Symptoms, Answer) :-
checkForDiseaseStrong(Symptoms, "typhoid"),
Answer = "The patients disease is almost certainly typhoid.".
suggest(Symptoms, Answer) :-
checkForDiseaseWeak(Symptoms, "typhoid"),
Answer = "The patients disease might be typhoid.".
% plague
suggest(Symptoms, Answer) :-
checkForDiseaseStrong(Symptoms, "plague"),
Answer = "The patients disease is almost certainly plague.".
suggest(Symptoms, Answer) :-
checkForDiseaseWeak(Symptoms, "plague"),
Answer = "The patients disease might be plague.".
% haemophilia
suggest(Symptoms, Answer) :-
checkForDiseaseStrong(Symptoms, "haemophilia"),
Answer = "The patients disease is almost certainly haemophilia.".
suggest(Symptoms, Answer) :-
checkForDiseaseWeak(Symptoms, "haemophilia"),
Answer = "The patients disease might be haemophilia.".
% whooping cough
suggest(Symptoms, Answer) :-
checkForDiseaseStrong(Symptoms, "whooping cough"),
Answer = "The patients disease is almost certainly whooping cough.".
suggest(Symptoms, Answer) :-
checkForDiseaseWeak(Symptoms, "whooping cough"),
Answer = "The patients disease might be whooping cough.".
% myasthenia
suggest(Symptoms, Answer) :-
checkForDiseaseStrong(Symptoms, "myasthenia"),
Answer = "The patients disease is almost certainly myasthenia.".
suggest(Symptoms, Answer) :-
checkForDiseaseWeak(Symptoms, "myasthenia"),
Answer = "The patients disease might be myasthenia.".
% atrial fibrillation
suggest(Symptoms, Answer) :-
checkForDiseaseStrong(Symptoms, "atrial fibrillation"),
Answer = "The patients disease is almost certainly atrial fibrillation.".
suggest(Symptoms, Answer) :-
checkForDiseaseWeak(Symptoms, "atrial fibrillation"),
2021-06-13 16:48:31 +02:00
Answer = "The patients disease might be atrial fibrillation.".