如何找到2个列表的长度并在Prolog中进行比较

时间:2016-03-31 08:07:43

标签: prolog

我已经写了这个代码,它接受一个列表并找到长度..

percent(List,Int):-
   percent1(List,0,Int).

percent1([],New,New).
percent1([H|T],New,An):-
   Sum is New +1,
   percent1(T,Sum,An).

我有这个KB

kb(iron_defficiency,[headache,dizziness,cold,weakness,fatigue,heartbeat,loss_concentration,swelling_tongue,breath],[gender,pregnancy,vitamin_poor_diet,fe,feritin,b12,hb,hct,mcv,plt,wbc,rtc]).
kb(thalassemia,[loss_appetite,painful_spleen,pale_skin],[gender,parent1,parent2,face_features,fe,feritin,b12,hb,hct,mcv,plt,wbc,hbf,hba1,hba2,rtc]).
kb(minor_thalassemia,[headache,fatigue,weakness,pale_skin,swelling_tongue,cold,heartbeat,loss_concentration,breath,dizziness],[vitamin_poor_diet,gender,pregnancy,parent1,parent2,hbaf,hba2,fe,feritin,b12,hb,hct,mcv,plt,wbc,rtc]).
[loss_appetite,weakness,vitamin_poor_diet,heartbeat,loss_weight,breath,pale_skin,headache,fatigue],[medication,alcohol,fe,feritin,b12,hb,hct,mcv,plt,wbc,folic_acid,b12,rtc]).

现在我想获取第一个列表,看看哪些项目在kb中,在每个kb上返回一个列表,然后比较这些列表的长度并找到百分比值。 实施例

  

如果(Length_list == 5和Length_kb_iron == 3)则k = 3/5 * 100.

并在所有kb上执行此操作,结果我想要像

  

结果= [未成年人50%,铁缺乏75%......]

我已经制作了一个可以找到列表但仅返回疾病的谓词,但我不知道如何计算这个问题。

findDiseases(PositiveSymptoms, Diseases) :-
   findDiseases(PositiveSymptoms, Diseases, []).

findDiseases([], Answer, Answer).
findDiseases([H|T], Diseases, Answer) :-
   findall(Disease,
         (  kb(Disease,Simptoms_list,Feauture_list),
            ( member(H,Simptoms_list) ; member(H,Feauture_list) )
         ),
        As),
   append(As, Answer, NewAnswer),
   findDiseases(T, Diseases, NewAnswer).

1 个答案:

答案 0 :(得分:2)

如果我正确理解您的问题,您需要计算与您的知识库中的疾病症状或特征相匹配的阳性症状的百分比。由于您已经有一个描述具有匹配症状/特征的疾病列表的谓词,您可以使用谓词intersection / 3和length / 2来找出实际匹配的阳性症状的数量。

percentages(PositiveSymptoms,DisPerc) :-
    findDiseases(PositiveSymptoms,DList),
    list_set(DList,DSet),
    symptoms_diseases_percentages(PositiveSymptoms,DSet,DisPerc).

symptoms_diseases_percentages(_S,[],[]).
symptoms_diseases_percentages(S,[D|Ds],[D-P|DPs]) :-
    kb(D,Slist,Flist),
    intersection(S,Slist,I1),
    intersection(S,Flist,I2),
    length(S,LenS),
    length(I1,LenI1),
    length(I2,LenI2),
    P is ((LenI1+LenI2) / LenS) * 100,
    symptoms_diseases_percentages(S,Ds,DPs).

% list_set(List1,List2)
% List2 ist List1 without duplicates
list_set([],[]).
list_set([X|Xs],[X|Ys]) :-
    subtract(Xs,[X],Zs),
    list_set(Zs,Ys).

谓词百分比/ 2描述了给定疾病的百分比和给定的阳性症状列表的百分比。例如,在下面的查询中thalassemia-25.0表示4种给定症状中有25%符合地中海贫血症的症状/特征。

?- percentages([headache,cold,heartbeat,pale_skin],D).
D = [thalassemia-25.0,minor_thalassemia-100.0,iron_defficiency-75.0]

请注意,只有当疾病的症状和特征列表不相交时,此方法才有效。否则,您的百分比可能会超过100%。