В SWI-Prolog:
mod5(X, Y) :-
Y is X mod 5.
apply_mod5_to_list(L1, L2) :-
maplist(mod5, L1, L2).
Использование:
?- apply_mod5_to_list([2, 4, 6, 8], L2).
L2 = [2, 4, 1, 3].
?- apply_mod5_to_list([2, 4.1, 6, 8], L2).
ERROR: mod/2: Type error: `integer' expected, found `4.1'
?- apply_mod5_to_list([2, not_number, 6, 8], L2).
ERROR: is/2: Arithmetic: `not_number/0' is not a function
Вы можете легко изменить этот код, если вы хотите немного другого поведения, например, если вы хотите терпеть нецелые числа (почему вы хотите это кстати?).
Если вы не можете использовать maplist
, вы можете реализовать его самостоятельно, хотя бы в более специализированной версии, например, что-то вроде этого:
partition_the_list_into_first_and_rest([X | Xs], X, Xs).
% The result on an empty list is an empty list
apply_mod5_to_list([], []).
% If the input list contains at least one member
apply_mod5_to_list(L1, L2) :-
partition_the_list_into_first_and_rest(L1, X, Xs),
call(mod5, X, Y),
partition_the_list_into_first_and_rest(L2, Y, Ys),
apply_mod5_to_list(Xs, Ys).
К этому коду вы все еще можете применить много синтаксических упрощений, которые вы, вероятно, должны сделать, чтобы превратить его в приемлемое решение для домашнего задания ...