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

在Prolog中,如何检查列表B中列表A中元素的N?,prolog,predicate,Prolog,Predicate,我有这两个列表= fruits([banana, apple, mangoes, pears]). foodILike([hamburgers, banana, shakes, fries]). 我想编写一个prolog谓词,当它在水果列表中的foodsILike列表中看到1个项目时,它将立即返回true。我怎样才能这样做呢 成员可以1)单独生成给定列表的所有成员,和/或2)给出特定元素是否在特定列表中的是/否答案。我相信您希望使用水果上的第一个表单来生成水果的每个元素,第二个表单在foodI

我有这两个列表=

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

我想编写一个prolog谓词,当它在水果列表中的foodsILike列表中看到1个项目时,它将立即返回true。我怎样才能这样做呢

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

成员可以1)单独生成给定列表的所有成员,和/或2)给出特定元素是否在特定列表中的是/否答案。我相信您希望使用
水果
上的第一个表单来生成
水果
的每个元素,使用
类食品
上的第二个表单来查看是否存在这些元素。

首先,简单的回答是:

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不会“尽快”完成某些事情。它迭代所有可能的解决方案。你得到第一个答案,然后是第二个答案,依此类推。

首先,简单的答案是:

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不会“尽快”完成某些事情。它迭代所有可能的解决方案。您将得到第一个解决方案,然后是第二个解决方案,依此类推。

您需要检查
N
项是否重叠,还是只检查一个?还有,这是家庭作业吗?不是真的HW-我更感兴趣的是如何在Prolog中做一些涉及更复杂形式的递归的事情。你需要检查
N
项重叠还是只有一个?还有,这是家庭作业吗?不是真的HW-我更感兴趣的是如何在Prolog中做一些涉及到更复杂形式的递归的事情。这对我来说是新闻-我如何判断成员给我的答案是“是”还是“否”?比如如果(成员)然后(做某事)。或者整个if语句在序言中是不允许的?嗯……我很久没有写任何序言了,所以请耐心听我说。您不会(通常无论如何)编写类似if语句的语句——您只有一条规则,该规则只有在X的某个元素也是Y的某个元素时才会成功。如果您在Prolog命令提示符下输入相同的查询,您可以得到yes/no(或者,等价地,true/false)答案,例如
?成员(A、[A、B、C])
将给出“是”,但
?成员(A、[B、C])
将给出“否”。在一个更大的表达式中,它将无法统一,因此整个表达式将失败。@Waffles:您可以使用if-then-else(假设小Bobby Tables的答案)
foultsilike(F)->write(F);写下(‘我不喜欢水果’)。
这对我来说是个新闻——我如何判断会员给我的答案是肯定还是否定?比如如果(成员)然后(做某事)。或者整个if语句在序言中是不允许的?嗯……我很久没有写任何序言了,所以请耐心听我说。您不会(通常无论如何)编写类似if语句的语句——您只有一条规则,该规则只有在X的某个元素也是Y的某个元素时才会成功。如果您在Prolog命令提示符下输入相同的查询,您可以得到yes/no(或者,等价地,true/false)答案,例如
?成员(A、[A、B、C])
将给出“是”,但
?成员(A、[B、C])
将给出“否”。在一个更大的表达式中,它将无法统一,因此整个表达式将失败。@Waffles:您可以使用if-then-else(假设小Bobby Tables的答案)
foultsilike(F)->write(F);写下(‘我不喜欢水果’)。
+1。我建议对第一个版本进行两个改进:1。将两个对
member
的调用放在末尾,这样Prolog就不需要回溯对
foodILike
的调用,2。使用
memberchk
而不是第二次调用
member
@larsmans:我同意你的改进,但第二个版本还是更好的。IHMO把清单放在事实上是不好的做法;使用多子句谓词更自然。@Bobby:是的,但OP最初的问题是关于两个列表的交集。+1。我建议对第一个版本进行两个改进:1。将两个对
member
的调用放在末尾,这样Prolog就不需要回溯对
foodILike
的调用,2。使用
memberchk
而不是第二次调用
member
@larsmans:我同意你的改进,但第二个版本还是更好的。IHMO把清单放在事实上是不好的做法;使用多子句谓词更自然。@Bobby:是的,但OP最初的问题是关于两个列表的交集。