:- use_module(library(list_util)).

% predicates for use during testing
map_include_test_num(X,X) :- number(X).
map_include_test_num_2(X,X,X) :- number(X).
map_include_test_num_3(X,X,X,X) :- number(X).
map_include_mapping_3(A,_B,C,D) :- D is C+A.
map_include_test_f(X,Y) :- number(X), succ(X, Y).
map_include_test_f_2(X,Y,Z) :- maplist(number, [X,Y]), Z is X+Y.
map_include_test_f_3(A,B,C,D) :- maplist(number,[A,B,C]), D is A*B*C.

:- use_module(library(tap)).

just_mapping :-
    map_include(succ, [1,2,3], [2,3,4]),
    map_include(plus, [1,2,3], [1,2,3], [2,4,6]),
    map_include(map_include_mapping_3, [5,34,12], [15,44,22], [3,1,22], [8,35,34]).
just_filtering :-
    map_include(map_include_test_num, [1,a,3], [1,3]),
    map_include(map_include_test_num_2, [a,2,q], [a,2,q], [2]),
    map_include(map_include_test_num_3, [1,a,3], [1,5,3], [1,2,3], [1,3]).
both_mapping_and_filtering :-
    map_include(map_include_test_f, [a,1,2,b], [2,3]),
    map_include(map_include_test_f_2, [a,1,2], [1,3,4], [4,6]),
    map_include(map_include_test_f_3, [a,1,2], [1,3,4], [5,10,15], [30,120]).