【问题标题】:Prolog Sum value numbers smaller than limitProlog Sum 值数小于限制
【发布时间】:2020-07-03 15:58:27
【问题描述】:

定义谓词 summy(List, Limit, N),其中 List 是绝对值数字的列表,N 是值小于 Limit 的 List 列表中这些数字的总和。

这就是我所拥有的: *

abx([],[]).
abx([H|T], [H|T1]):-
    H >= 0,!,
    abx(T,T1).
abx([M|T], [M1|T1]):-
    M < 0,
    M1 is M * (-1),
    abx(T,T1).

summy([], [], []).
summy([H|T], L, N):-
    abx([H|T], [X|Y]),
     X < L,
    sumlist([X|Y], N).

如果我运行示例,它会显示 X=26,而不是 X=11。

【问题讨论】:

  • 你尝试了什么,什么不起作用?
  • 我遇到了 X
  • 好吧,您只是在过滤“第一个”项目。在X &lt; L 的情况下,它将汇总整个列表。否则,谓词将失败。

标签: prolog


【解决方案1】:

过滤部分错误。 X &lt; L 将检查X,列表的第一个元素是否小于L。如果是,则计算所有绝对值之和,如果不是,则整个谓词将失败。

因此,您应该过滤,例如:

filterless([], L, []).
filterless([H|T], L, [H|T2]) :-
    H < L,
    filterless(T, L, T2).
filterless([H|T], L, T2) :-
    H > L,
    filterless(T, L, T2).

那么总结如下:

summy(Xs, L, R) :-
    abx(Xs, As),
    filterless(As, L, Bs),
    sumlist(Bs, R).

然而,我们可以使用maplist/3 [swi-doc] 进行映射,并使用include/3 [swi-doc] 过滤列表,因此我们可以将summy/3 重写为:

summy(Xs, L, R) :-
    maplist(abs, Xs, As),
    include(>(L), As, Bs),
    sumlist(Bs, R).

【讨论】:

  • 哇,我不知道 maplist/3 和 include/3。非常感谢你,你是天才。
猜你喜欢
  • 1970-01-01
  • 2019-09-06
  • 1970-01-01
  • 1970-01-01
  • 2023-02-02
  • 1970-01-01
  • 1970-01-01
  • 2023-03-02
  • 2017-07-15
相关资源
最近更新 更多