比较Prolog中的埋藏列表

时间:2016-07-01 16:25:43

标签: prolog

我正在尝试以下代码:

disease(flu, [fever, chills, nausea]).
disease(cold, [cough, runny_nose, sore_throat]).
disease(hungover, [headache, nausea, fatigue]).

getSymptoms([Symptom|List]):-
    writeln('Enter Symptom:'),
    read(Symptom),
    dif(Symptom,stop),
    getSymptoms(List),
    intersection(disease(_,List1), List, Outlist).

getSymptoms([]).

输入法来自:Creating a list from user input with swi-prolog

用户以:

开头
getSymptoms(L).

我需要收集患者的症状(比如输入以下内容:发烧,发冷)

然后,我需要将此列表与每种疾病的症状列表进行比较,并找出2个列表之间常见的症状。

getSymptoms(L)正在收集症状,但没有交叉并返回一个空列表:

?- getSymptoms(L).
Enter Symptom:
|: fever.
Enter Symptom:
|: stop.
L = [].

以下也没有用:

intersection(findall(L,disease(_,L),Out), List, Outlist).

我该如何纠正?谢谢你的帮助。

编辑:使用@wouter_beek建议的代码,我得到:

disease(_, List1),
sort(List1, SList1),
sort(List, SList),
intersection(SList1, SList, OutList).

?- getSymptoms(L).
Enter Symptom:
|: fever.
Enter Symptom:
|: cough.
Enter Symptom:
|: stop.
L = [fever, cough] ;
L = [fever, cough] ;
L = [fever, cough] ;
L = [fever, cough] ;
L = [fever, cough] ;
L = [fever, cough] ;
L = [fever, cough] ;
L = [fever, cough] ;
L = [fever, cough] ;
L = [fever] ;
L = [fever] ;
L = [fever] ;
L = [].

我想要显示常见症状数的疾病。

1 个答案:

答案 0 :(得分:1)

您正在调用intersection/3谓词,就好像它是一个函数:

intersection(findall(L,disease(_,L),Out), List, Outlist).

但这不是Prolog的工作方式。 intersection(X, Y, Z)表示三组之间的关系。 findall(L, disease(_, L), Out)不表示集合。 Out是一个列表,但不一定是一个集合。您可以使用sort/2

您应该使用以下行执行类似的操作:

intersection(disease(_,List1), List, Outlist).

为:

disease(_, List1),
sort(List1, SList1),
sort(List, SList),
intersection(SList1, SList, OutList).