2

病気の確実性係数を計算するためにすべての患者の症状を数えようとしていますが、各病気の症状は 1 つだけです。
また、結果にはいくつかの重複が表示されます。
確実性係数は、患者の症状の数/病気の症状の合計です。

start:- 
  write('Enter the name of the patient: '), read(Patient),
  write('Enter the symptoms: '), read(Symptoms), write('\n'),
  countSint(Diseases, Symptoms , Patient).

countSint(Diseases, Symptoms , Patient) :-
  findall(Sint , member(Sint, Symptoms),   L1), length(L1 , Size),
  (  Size < 2
  -> writeln('Enter with at least 3 symptoms...\n'), start
  ;  Size > 1
  -> write('\n Enter semicolon...:\n\n'), write('Patient: '), write(Patient),
     diagnose(Symptoms,Diseases, L)
  ).

diagnose(Symptoms,Diseases,L) :- search(Symptoms, Diseases, L).

% disease(Disease, Symptoms, Num).
disease(meningitis,[fever, stiff_neck],2).
disease(dengue,[fever, vomiting, red_spots], 3).

% search(Symptoms, Diseases, L).
search([H|T] , Diseases, L) :-
  disease(Disease, Symptoms, Num),
  Disease0 = [Disease,Diseases],
  member(H, Symptoms),
  search(T , Diseases0, L),
  write('has '), write(Disease), writeln(': '),
  setof(H, (disease(Disease, Symptoms, Num),
            member(H, Symptoms)), L),
  length(L, Size),
  calc_cf(Num, Size, R).

calc_cf(Num, Size, R):- % Calculate the certainty factor
  R is Size / Num * 100,
  write('The certainty factor is '),
  write(R),
  writeln('%').

誰か助けてくれませんか?

4

1 に答える 1

1

これは役に立たないようです:

findall(Sint , member(Sint, Symptoms),   L1)

症状をL1に書き換えるだけです。なんで?

このスニペットでは

  (  Size < 2
  -> writeln('Enter with at least 3 symptoms...\n'), start
  ;  Size > 1
  -> write('\n Enter semicolon...:\n\n'), write('Patient: '), write(Patient),
     diagnose(Symptoms,Diseases, L)
  )

別の選択肢があるはずです。

この事実disease(Disease, Symptoms, Num).は役に立たないはずですが、それ以上の処理をより困難にするバインドされていない変数が導入されます。

library( aggregate )を調べることを検討できます。ここでは、ソリューションをカウントするための巧妙に作成された述語が見つかります。

countSint(Diseases, Symptoms, Patient) :-
  aggregate(count, diagnose(Symptoms, Diseases, _), Count),
  format('diagnosed:~d for:~w~n', [Count, Patient]).

編集

ロジックをプレゼンテーションから分離し、ここでいくつかの良いフィードバックを得る方が良いので、コードから書き込み/読み取りを削除し、代わりに気になる例を示す必要があると思います。あなたのコメントから推測できるように、今私はあなたが必要とする本質的な公式を示します:

disease(meningitis, [fever, stiff_neck]).
disease(dengue, [fever, vomiting, red_spots]).

% find diseases from symptoms, sort by certainty factor
diagnose(Symptoms, Diseases) :-
     setof(CF-Disease, common_symptoms(Symptoms, Disease, CF), Diseases).

common_symptoms(Symptoms_Patient, Disease, CF) :-
    disease(Disease, Symptoms_Disease),
    intersection(Symptoms_Patient, Symptoms_Disease, Common_Symptoms),
    length(Common_Symptoms, NCS),
    length(Symptoms_Disease, NSD),
    CF is NCS / NSD * 100.

テスト:

?- diagnose([fever, stiff_neck],L).
L = [33.33333333333333-dengue, 100-meningitis].
于 2012-09-01T19:30:51.533 に答える