Prolog 小于极限值的和值

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

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

这就是我的结果:*

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] 来做一个摸底,和 include/3 [swi-doc] 来过滤列表,所以我们可以重写一下 summy/3 到:

summy(Xs, L, R) :-
    maplist(abs, Xs, As),
    include(>(L), As, Bs),
    sumlist(Bs, R).
© www.soinside.com 2019 - 2024. All rights reserved.