获取Prolog中列表之间的常用项目数

时间:2016-07-01 02:35:09

标签: prolog

我想修改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
     }
}

1 个答案:

答案 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]