0

初学者在这里序言;只是想问一个问题,以摆脱我对作业问题的一些困惑。

假设我有一份事实清单(在这种情况下,是一份他们吃的人和食物的清单以及物品数量),

label(test,
  [eats(george,apple,3),
   eats(bob,orange,1),
   eats(joe,steak,1)]).

我如何使用这个数组中的事实?例如,我将如何让它工作?

eaten(Person,Food):-
  eats(Person,Food,_).
4

2 回答 2

1

由于缺乏上下文,我认为您的问题毫无意义。

将事实列表推送到数据库中的一种可能用法:

?- maplist(assert, [eats(george,apple,3), eats(bob,orange,1), eats(joe,steak,1)]).
true.

?- eats(Person,Food,_).
Person = george,
Food = apple ;
Person = bob,
Food = orange ;
Person = joe,
Food = steak.

但同样,这都是关于你剩余的规则......

编辑通常“信息流”是相反的:我们从数据库事实开始,将相关数据收集到一个列表并处理该列表。Daniel 解释了如何访问列表中的元素。考虑从列表中断言事实之后,您的规则将可以访问事实。使用您列出的规则,之后:

?- retractall(eats(_,_,_)),
   maplist(assert, [eats(george,apple,3), eats(bob,orange,1), eats(joe,steak,1)]).

?- eaten(bob,X).
X = orange.

高温高压

于 2013-03-28T23:21:45.907 回答
1

我想我明白你在问什么。答案是这样使用member/2

eaten(Person, Food) :- 
  label(test, Eating),
  member(eats(Person, Food, _), Eating).

这是你想要的结果吗?

?- eaten(P, F).
P = george,
F = apple ;
P = bob,
F = orange ;
P = joe,
F = steak.

根据经验,传递列表可能比将其存储在这样的大块中更“标准”。我可能会说这是一个eats/3 结构列表而不是事实,但是这种用法有点模糊了区别,因为数据库中的内容是一个称为 arity 2 的事实,label而不是一组称为 3 的事实eats。但它们实际上是在数据库中,以一种迂回的方式。有趣的。

这种member用于遍历列表的方法也常用于为过程提供选项。open/4例如,使用它。

于 2013-03-29T03:26:54.627 回答