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

发布于 2024-10-19 07:29:46 字数 204 浏览 5 评论 0原文

我有这两个列表 =

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

我想编写一个序言谓词,一旦看到水果列表中的 foodIlike 列表中的 1 个项目,该谓词就会返回 true。我该如何去做呢?

I have these two lists =

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

I want to write a prolog predicate that will return true as soon as it sees 1 items in the foodsILike list in the fruits list. How can I go about doing so?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

扶醉桌前 2024-10-26 07:29:46

首先,对于简单的答案:

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

First, for the plain answer:

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

You could avoid the membership check by flattening the fruits and foods lists:

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

That said, you seem to try and solve problems in Prolog using imperative idioms, and that won't work. First, predicates do not return anything. When calling a predicate, Prolog unifies its arguments with valid values according to the facts and rules in the program. Therefore, the "returned value" are the assignments to unbound variables. Second, Prolog does not do something "as soon as". It iterates over all possible solutions. You get the first solution, then the second solution, and so on.

oО清风挽发oО 2024-10-26 07:29:46

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

member can 1) individually generate all the members of a given list and/or 2) give a yes/no answer as to whether a particular element is in a particular list. I believe you want to use the first form on fruits to generate each of the elements of fruit, and the second form on foodILike to see if any of those is present.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文