初学者在这里序言;只是想问一个问题,以摆脱我对作业问题的一些困惑。
假设我有一份事实清单(在这种情况下,是一份他们吃的人和食物的清单以及物品数量),
label(test,
[eats(george,apple,3),
eats(bob,orange,1),
eats(joe,steak,1)]).
我如何使用这个数组中的事实?例如,我将如何让它工作?
eaten(Person,Food):-
eats(Person,Food,_).
由于缺乏上下文,我认为您的问题毫无意义。
将事实列表推送到数据库中的一种可能用法:
?- 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.
高温高压
我想我明白你在问什么。答案是这样使用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
例如,使用它。