gpt4 book ai didi

prolog - 在 Prolog 中创建一个谓词,只对列表中的偶数的平方求和

转载 作者:行者123 更新时间:2023-12-04 18:33:49 24 4
gpt4 key购买 nike

我试图弄清楚如何在 prolog 中创建一个谓词,该谓词只对给定列表中的偶数的平方求和。

预期输出:

?- sumsq_even([1,3,5,2,-4,6,8,-7], Sum).

Sum = 120 ;

false.

我知道如何从列表中删除所有奇数:
sumsq_even([], []).
sumsq_even([Head | Tail], Sum) :-
not(0 is Head mod 2),
!,
sumsq_even(Tail, Sum).
sumsq_even([Head | Tail], [Head | Sum]) :-
sumsq_even(Tail, Sum).

这给了我:
Sum = [2, -4, 6, 8]

而且我还知道如何对列表中数字的所有平方求和:
sumsq_even([], 0)
sumsq_even([Head | Tail], Sum) :-
sumsq_even(Tail, Tail_Sum),
Sum is Head * Head + Tail_Sum.

但我似乎无法弄清楚如何将这两者联系在一起。我想我可能在这方面走错了路,但我不确定如何定义适当的关系以使其有意义。

谢谢!

最佳答案

把你的问题分成更小的部分。正如您已经说过的,您应该结合使用两个不同的功能:

  • 从列表中删除奇数 ( even )
  • 对列表中所有数字的平方求和 ( sumsq )

  • 因此,首先,为不同的功能使用不同的谓词名称:
    even([], []).
    even([Head | Tail], Sum) :-
    not(0 is Head mod 2),
    !,
    even(Tail, Sum).
    even([Head | Tail], [Head | Sum]) :-
    even(Tail, Sum).

    sumsq([], 0).
    sumsq([Head | Tail], Sum) :-
    sumsq(Tail, Tail_Sum),
    Sum is Head * Head + Tail_Sum.

    在第三个谓词中,您现在可以组合两个后续较小的步骤:
    sumsq_even(List, Sum) :-
    even(List, Even_List),
    sumsq(Even_List, Sum).

    在此规则中,首先将(输入)列表减少到偶数元素( Even_List ),然后计算平方和。

    这是您示例的结果:
    sumsq_even([1,3,5,2,-4,6,8,-7], Sum).
    S = 120.

    关于prolog - 在 Prolog 中创建一个谓词,只对列表中的偶数的平方求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36469366/

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