gpt4 book ai didi

序言 | findall 与另一个 findall 的结果列表

转载 作者:行者123 更新时间:2023-12-05 09:36:57 27 4
gpt4 key购买 nike

如何通过特定条件获取值,然后使用这些选定元素从其他事实系列中获取值?

我有这个代码

%code, date, amount
values1('AAA', date(02, 03, 2020), 1000).
values1('AAA', date(31, 03, 2020), 2000).
values1('BBB', date(02, 04, 2020), 1350).
values1('BBB', date(15, 04, 2020), 1500).
values1('CCC', date(23, 05, 2020), 5500).
values1('CCC', date(01, 05, 2020), 750).
values1('DDD', date(06, 05, 2020), 3560).
values1('AAA', date(18, 06, 2020), 4600).
values1('CCC', date(27, 07, 2020), 1200).

%code, percent
values2('AAA', '0.2').
values2('BBB', '0.25').
values2('CCC', '0.55').
values2('DDD', '0.98').

predicate1(Code, Percent) :-
findall(Code, (values1(Code, _, Value), Value > 1000), Code),
findall(Percent, values2(Code, Percent), Percent).

例如,在这种情况下,它的想法是获取数量大于 1000 的代码,并且当有选择时从 value2 中获取百分比,但百分比列表返回空。为什么会这样?

这是返回

predicate1(Code, Percent).
Code = ['AAA', 'BBB', 'BBB', 'CCC', 'DDD', 'AAA', 'CCC'],
Percent = []

可能是 Code 列表中的元素数量与 values2 的事实数量之间的差异?

最佳答案

你有一个拼写错误和(一些)逻辑错误。

Code 的值进入Code 列表:CodeList。您在第一和第三位置有变量 Code。使用这个:

findall(Code, (values1(Code, _, Value), Value > 1000), CodeList).

运行它:

?- findall(Code, (values1(Code, _, Value), Value > 1000), CodeList).
CodeList = ['AAA', 'BBB', 'BBB', 'CCC', 'DDD', 'AAA', 'CCC'].

通过使用谓词 setof/3 来删除重复元素。

但是,setof/3 要求您指明(使用脱字符符号“存在量化”:Value^Date^)在内部之外不可见的变量目标,否则回溯 ValueDate 的可能值将发生在 setof/3 之外:

?- setof(Code, Value^Date^(values1(Code, Date, Value), Value > 1000), CodeList).
CodeList = ['AAA', 'BBB', 'CCC', 'DDD'].

现在你只需要用“百分比”“加入”任何“代码”......在 setof/3 中:

?- setof([Code,Percent], 
Value^Date^(values1(Code, Date, Value),
Value > 1000,
values2(Code,Percent)),
Set).

Set = [['AAA', '0.2'], ['BBB', '0.25'], ['CCC', '0.55'], ['DDD', '0.98']].

您可以将其打包成一个谓词,该谓词回溯 setof/3 结果:

gimme(Code, Percent) :-
setof([Code,Percent],
Value^Date^(values1(Code, Date, Value),
Value > 1000,
values2(Code,Percent)),
Set),
member([Code,Percent],Set).

注意 CodePercent 变量在 setof/3member/2< 调用中的重用 s well 实际上没问题:这些不是相同的变量。

所以:

?- gimme(Code,Percent).
Code = 'AAA',
Percent = '0.2' ;
Code = 'BBB',
Percent = '0.25' ;
Code = 'CCC',
Percent = '0.55' ;
Code = 'DDD',
Percent = '0.98'.

关于序言 | findall 与另一个 findall 的结果列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64705799/

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