我在定义事实和在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 =牛奶,X =鲨鱼。
答案 0 :(得分:1)
您缺少member/2
调用以从数组中获取元素:
foodForPerson(F,C) :-
isAllergic(F, Xs),
members(X,Xs),
allergen(X,C).
虽然更好的表达方式是使用事实而不是列表,因此:
isAllergic(john, fish).
isAllergic(john, milk).
在这种情况下,你提出的谓词会起作用。此外,assert
和retract
单一事实很容易。或者结合不同的图书馆,每个人都知道约翰的事情。
修改强>
如果您希望同时使用allergen
的列表,您可以使用成员两次:
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
。