我正在尝试以下代码:
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 = [].
我想要显示常见症状数的疾病。
答案 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).