序言值总和小于限制

问题描述 投票:2回答:1

定义谓词伪装(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。

prolog swi-prolog
1个回答
1
投票

过滤部分错误。 X < 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]进行映射,并使用maplist/3过滤列表,因此我们可以将include/3 [swi-doc]重写为:

include/3
© www.soinside.com 2019 - 2024. All rights reserved.