2013-03-28 25 views
0

初学者在这里prolog;只是想提出一个问题来摆脱我对任务问题的一些困惑。序言 - 如何在事实中使用事实?

假设我有事实的列表(在这种情况下,人与食物的清单,他们吃和物品#),

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

我怎么用事实这数组中?例如,我如何得到这个工作?

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

回答

1

我觉得你的问题没有意义,因为缺乏上下文。

的事实列表的可能使用它来推动它在DB:

?- 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. 

HTH

+0

一个更好的问题可能是:如果我有一个事实清单,我该如何获取这些事实?我的代码实际上是我最初的问题中的6行,但我不知道如何在规则/查询中访问'eats(george,apple,3)'。 – xLCaliburn

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结构而不是事实的列表,但是这个使用一种模糊的区别,因为什么是数据库是一个元数的2其实所谓label而不是一组元数3事实被称为eats。但他们实际上是在数据库中,以一种迂回的方式。有趣。

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