gpt4 book ai didi

list - 使用 Prolog 总结列表

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

我想对大于某个给定数字的所有列表元素求和。描述如下:

sumup(L, N, GREATN, GEN) sums up the members of list L which are greater than GREATN to a variable N and puts these members into the list GEN.

Sample query:

?- sumup([8, 6, 10, 3, 9, 12], N, 7, GEN).GEN = [8, 10, 9, 12],                             % expected answerN = 39.                                           % 8+10+9+12 = 39

以下是我的代码:

sum_list([], 0).
sum_list([H|T], Sum) :-
H > 3,
sum_list(T, Rest),
Sum is H + Rest.
sum_list([H|T], Sum) :-
H < 3,
write('').

我尝试过递归方法,但失败了。我该如何修复它?

最佳答案

查看您的问题和代码,我注意到一些事情:

  • 虽然您多次提到“数字”,但您的样本只是整数。我们可以忽略非整数( float 、有理数)而只处理整数吗?我想是的。
  • 有一个自动加载的 SWI-Prolog library(lists) 谓词sum_list/2 .
    调用您的谓词 sum_list/2是一个不幸的选择。我们再选一个名字吧!
  • 您对 sum_list/2 的定义包括三个子句:

    1. sum_list([], 0).好的!
    2. sum_list([H|T], Sum) :- <b>H > 3</b>, sum_list(T, Rest), Sum is H + Rest.

      通知H > 3 ?为什么对常量整数 3 进行硬编码?

    3. sum_list([H|T], Sum) :- <b>H < 3</b>, <b>write('')</b>.

      • 该子句不是递归的。我们需要查看所有列表元素来计算总和,而不是停在第一个列表元素 H满足H < 3 !

      • write('')有什么用? ?我什么也没看到。

      • 目标有什么用H < 3 ?如上所述,为什么要硬编码整数 3

      • 第 2 条涵盖 H > 3 。第 3 条涵盖 H < 3怎么样H = 3


在此答案中,我们使用 ,存在于 中.

这是 sumup/4 的简单定义基于 。虽然它可以通过多种方式进行改进(更好的确定性、累加器风格,可能一些巧妙的冗余约束也可能有所帮助),但就目前而言,这是一个不错的第一次尝试:

:- use_module(library(clpfd)).sumup([], 0, _, []).sumup([Z|Zs], S0, P, [Z|Xs]) :-   Z  #> P,   S0 #= S+Z,   sumup(Zs, S, P, Xs).sumup([Z|Zs], S, P, Xs) :-   Z #=< P,   sumup(Zs, S, P, Xs).

OP 给出的示例查询:

?- sumup([8,6,10,3,9,12], N, 7, GEN).   N = 39, GEN = [8,10,9,12]             % expected answer;  false.                                % leftover useless choicepoint

关于list - 使用 Prolog 总结列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34461850/

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