1

如何从可以除以 3(即x % 3 == 0)的列表中删除所有元素?

4

3 回答 3

2

这是一个谓词 removemod(+List,+Mod,?Result):

removemod([],_,[]).
removemod([H|T],M,[H|T2]):-
    H mod M =\= 0,
    removemod(T,M,T2).
removemod([H|T],M,T2):-
    H mod M =:= 0,
    removemod(T,M,T2).

似乎工作:

15 ?- removemod([3,7,5,12,8,2,16,13,9,11,27],3,L).
L = [7, 5, 8, 2, 16, 13, 11] .

16 ?- removemod([66933],3,L).
L = [].
于 2012-06-07T10:13:52.223 回答
2

这样做的惯用方法是使用更高的顺序,例如在 SWI 中,有一个很好的谓词称为 exclude/3,它完全符合您的要求(基于谓词删除元素):

clean(List, FilteredList) :-
    exclude(mod3, List, FilteredList).

mod3(X) :-
    X mod 3 =:= 0.

使用lambda 库,更高阶的方式更优雅:

:- use_module(lambda).

filterMod3(List, FilteredList) :-
    exclude(\X^(X mod 3 =:= 0), List, FilteredList).
于 2012-06-08T09:27:15.870 回答
0

或者更简单findall(X,(member(X,[1,2,3,4,5,6,7,8,9,10]),0 =:= X mod 3),Y).

于 2012-06-07T20:41:25.083 回答