gpt4 book ai didi

variables - 正确使用 findall/3,特别是最后一个结果参数

转载 作者:行者123 更新时间:2023-12-03 04:35:04 25 4
gpt4 key购买 nike

我是 Prolog 的初学者,我正在处理一个对你来说可能看起来很愚蠢的问题,但我真的不明白我做错了什么!好的,我有这个文件fruits.pl,里面有类似这样的内容:

fruit(apple,small,sweet).
fruit(lemon,small,nosweet).
fruit(melon,big,sweet).

我已经(在该文件内创建了一个共存(X,Y)原子,用于检查两个水果是否可以放在盘子中。它工作得很好!但现在我无法创建一个建议(X)作为参数一个水果并返回可以放在同一个盘子中的水果列表。问题是我正在尝试制作类似的东西

suggest(X) :- findall(Y,fruit(Y,_,_), List), coexist(X,Y).

你觉得怎么样?每次我尝试在 swi prolog 中运行它时,都会出现警告“单例变量”,当我按

suggest(apple).

然后它说假..抱歉我的英语:/

最佳答案

Prolog 中的谓词不返回任何内容。您的目标是否满足,您可以将其解释为返回 truefalse

您的谓词 suggest(X) 应包含另一个参数,该参数将绑定(bind)到与 X 一起使用的水果列表。一个选项是:suggest(X, List),它描述了以下关系:List 表示与 X 一起出现的所有水果。然后,你可以问:

?- suggest(apple, List).
List = [pear, cherry].

目标 findall(Y, ... , ...) 在内部使用 Y 变量,并且 Y 在目标满足。因此,您应该将 coexist(X,Y) 移动到 findall/3 的第二个参数内,这是以所有可能的方式满足的目标。仅当实例化 X 时,下面的规则才有效 (suggest(+X, -List))。

suggest(X, List) :- findall(Y, (fruit(Y,_,_), coexist(X, Y)), List).

您可以这样理解:“List代表与X共存的所有水果Y”。

关于variables - 正确使用 findall/3,特别是最后一个结果参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24289286/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com