规则与操作中的Prolog数组

规则与操作中的Prolog数组,prolog,Prolog,在Prolog中定义事实和在数组中搜索时,我有一个小问题。我不知道,如何添加规则我的数组和它的结果 好的,需要一些这样的: % John is allergic to fish and milk. isAllergic(john, [fish, milk]). % food shark has allergen fish and john cant eat it and drink milk allergen(shark, fish). allergen(milk, milk). %I ne

在Prolog中定义事实和在数组中搜索时,我有一个小问题。我不知道,如何添加规则我的数组和它的结果

好的,需要一些这样的:

% John is allergic to fish and milk.
isAllergic(john, [fish, milk]).

% food shark has allergen fish and john cant eat it and drink milk
allergen(shark, fish).
allergen(milk, milk).

%I need list of food, what person (john) can eat.
foodForPerson(F,C):- isAllergic(F, X), allergen(X,C).
然后我叫FoodForPerson(约翰,X),但结果是假的。我认为,这个问题已经存在。
结果应该是X=milk,X=shark。

您缺少从数组中获取元素的
成员/2
调用:

foodForPerson(F,C) :-
    isAllergic(F, Xs),
    members(X,Xs),
    allergen(X,C).
尽管更好的表示方法是使用事实,而不是列表,因此:

isAllergic(john, fish).
isAllergic(john, milk).
在这种情况下,您提出的谓词将起作用。而且很容易断言和收回单个事实。或者结合不同的图书馆,了解约翰的情况

编辑

如果您希望使用过敏原列表,您可以使用会员卡两次:

isAllergic(john, [fish, milk]).

allergen(sharkWitHPotato, [fish, potato]).

foodForPerson(F,X) :-
    isAllergic(F, As),
    allergen(X,Cs),
    member(A,As),
    member(A,Cs).
请注意,在您的评论中,您交换了
allergen
的参数,我想是吧


但这可能导致多次列出同一元组
john,sharkWitHPotato

如何提出一个好问题:您不需要
元素/2
。Prolog已经有
成员/2
,例如
成员(b[a,b,c])
为true。根据Boris的评论,阅读关于如何提问的文档。您需要更好地具体描述您希望代码做什么以及它实际做什么。展示例子很有帮助。如果
isAllergic(john,[fish,milk])
是真的,那么根据您的代码注释,john怎么能喝牛奶呢?这段代码非常混乱。很不清楚你的事实和断言到底是什么意思。对不起,我错了!他当然不能喝牛奶,对不起/谢谢,这是我想要的。当我在过敏原阵列中有过敏原(sharkWitHPotato,[鱼,土豆])时?如何解决这个问题?@Felix:你交换了过敏原/2的参数了吗?现在您可能想返回
sharkWitHPotato
?是的,我想。。功能成员是正确的还是与成员相同?@Felix:你说的功能成员是什么意思?Prolog没有函数之类的东西。它与谓词和术语一起工作。有时谓词被转换为术语以允许更高阶的调用。foodForPerson(F,X):-isAllergic(F,As),allergen(X,Cs),members(A,As),member(A,Cs)。因为SWI序言不知道“成员”