规则和操作中的Prolog数组

时间:2014-12-30 18:17:50

标签: 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 need list of food, what person (john) can eat.
foodForPerson(F,C):- isAllergic(F, X), allergen(X,C).

然后我打电话给FoodForPerson(约翰,X),但结果是假的。我想,那个问题就在阵列中。 结果应该是X =牛奶,X =鲨鱼。

1 个答案:

答案 0 :(得分:1)

您缺少member/2调用以从数组中获取元素:

foodForPerson(F,C) :-
    isAllergic(F, Xs),
    members(X,Xs),
    allergen(X,C).

虽然更好的表达方式是使用事实而不是列表,因此:

isAllergic(john, fish).
isAllergic(john, milk).

在这种情况下,你提出的谓词会起作用。此外,assertretract单一事实很容易。或者结合不同的图书馆,每个人都知道约翰的事情。

修改

如果您希望同时使用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