gpt4 book ai didi

prolog - Setof 每次都返回列表,序言

转载 作者:行者123 更新时间:2023-12-02 04:26:38 26 4
gpt4 key购买 nike

我使用的谓词如下所示:

predicate(Country, X):-
setof(Length, anotherPredicate(Country,Length), X).

我的问题是我的代码为每个值返回列表 X。我想要的是返回一个包含所有数字的大列表,因为现在我得到了答案:

Country = adsfsadf;
X = [123];
Country = asfdsaf;
X = [312];

因此,每次我想要一个包含所有内容的大列表时,而不是每次都使用小列表。

编辑评论----------

predicate(Country, Length) :-
setof(p(ML,C,L),
( anotherPredicate(C, L), ML is -L ),
[p(_,Country, Length)|_]).

这是我写的,它立即给我错误。

最佳答案

目前,您会获得国家/地区 的每个解决方案的一个列表。之所以如此,是因为 setof/3 标识所有自由变量并为这些变量的每个不同实例生成一个列表。

但是你的要求不一致。一方面您只想拥有一个列表。只要您可以轻松构建解决方案集,这很容易提供。

 setof(Length, Country^anotherPredicate(Country,Length), X).

另一方面,您仍然希望 Country 变量作为 predicate/2 的第一个参数出现!这没有任何意义。无非就是坚持局部变量出现在外部上下文中。不幸的是,Prolog 不能直接检测到此类错误。对于与

predicate(Country, X):-
setof(Length, Country^anotherPredicate(Country,Length), X).

?- predicate(C, L).
L = [length_of_1, length_of_2].
?- C = c1, predicate(C, L).
C = c1, L = [length_of_1].

也就是说,通过专门化目标(通过添加C = c1),可以找到不同的L

但是,有一个警告:如果有两个长度相同的国家(例如 23),结果应该是什么?您想要单个元素 [23] 还是两个 [23,23]?从您的描述来看,这一点并不清楚。

如果您想要两个,您必须首先确定:

setof(Country-Length, anotherPredicate(Country, Length), CL),
keys_values(CL, Lengths),
...

编辑:回应您的评论:

biggestcountry_val(Country, Length) :-
setof(p(ML,C,L),
( anotherPredicate(C, L), ML is -L ),
[p(_,Country, Length)|_]).

关于prolog - Setof 每次都返回列表,序言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26503775/

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