我有这两个列表=
fruits([banana, apple, mangoes, pears]).
foodILike([hamburgers, banana, shakes, fries]).
我想编写一个prolog谓词,只要它在fruits列表中的foodsILike列表中看到1个项目就会返回true。我怎么能这样做?
答案 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
上的第二个表单来查看是否存在任何元素。