在Prolog中,如何检查列表B中列表A中的N个元素?

时间:2011-02-27 04:43:54

标签: prolog predicate

我有这两个列表=

fruits([banana, apple, mangoes, pears]).
foodILike([hamburgers, banana, shakes, fries]).

我想编写一个prolog谓词,只要它在fruits列表中的foodsILike列表中看到1个项目就会返回true。我怎么能这样做?

2 个答案:

答案 0 :(得分:3)

首先,对于简单的回答:

fruitsILike(F) :-
  fruits(Fs)
  member(F, Fs),
  foodILike(Ls),
  member(F, Ls).

您可以通过展平水果和食物清单来避免会员资格检查:

fruit(banana).
fruit(apple).
...
foodILike(hamburger).
foodILike(banana).
...
fruitsILike(F) :-
  fruit(F),
  foodILike(F).

那就是说,你似乎试图使用命令式习语来解决Prolog中的问题,这是行不通的。首先,谓词不会返回任何内容。在调用谓词时,Prolog根据程序中的事实和规则将其参数与有效值结合起来。因此,“返回值”是未绑定变量的赋值。其次,Prolog不会“尽快”做某事。它迭代所有可能的解决方案。你得到第一个解决方案,然后是第二个解决方案,依此类推。

答案 1 :(得分:1)

member可以1)单独生成给定列表的所有成员和/或2)给出关于特定元素是否在特定列表中的是/否答案。我相信您希望使用fruits上的第一个表单生成fruit的每个元素,并使用foodILike上的第二个表单来查看是否存在任何元素。