我想修改Creating a list from user input with swi-prolog上的代码:
flu: 1
cold: 1
hungover: 2
如果我输入3个症状:咳嗽,恶心,疲劳,我应该得到不同疾病的症状数量的输出,例如:
?- intersection([fever, chills, nausea] ,[cough, nausea, fatigue], X).
X = [nausea].
我怎样才能在Prolog中获得这个?我知道SWI-Prolog有一个可以使用的交叉函数,但是如何在这里应用呢?
public interface A{
void methodA();
}
public class AImpl implements A{
public void methodA(){
// todo something
}
}
public interface B{
void methodB();
}
public class BImpl implements B{
public void methodB(){
//todo somethong
}
}
答案 0 :(得分:1)
我不认为链接答案中数据的表示方式是表示此类数据的最佳方法。最好将数据呈现为更加通用的个别事实。因此,例如,以下是不灵活的并且模糊了个体症状关系:
disease(flu):-
symptom(fever),
symptom(chills),
symptom(nausea).
可以使用clause/2
提取个别症状,clause(disease(flu), Symptoms)
会产生Symptoms = (symptom(fever), symptom(chills), symptom(nausea))
,然后可以从中提取个别症状。
然而,我认为将其表示为:
更清楚illness_symptom(flu, chills).
illness_symptom(flu, nausea).
illness_symptom(flu, fever).
如果您想将特定疾病的症状收集到列表中,您只需使用findall/3
:
illness_symptoms(Illness, Symptoms) :-
findall(Symptom, illness_symptom(Illness, Symptom), Symptoms).
致电illness_symptoms(flu, Symptoms)
会产生Symptoms = [chills, nausea, fever]
。