add a second selectlist

This commit is contained in:
Vitor Santos Costa 2013-06-03 16:39:48 -05:00
parent 639247b4c3
commit 933ee11985
2 changed files with 42 additions and 0 deletions

View File

@ -9656,6 +9656,14 @@ elements of @var{ListIn}.
@cnindex selectlist/3 @cnindex selectlist/3
Creates @var{ListOut} of all list elements of @var{ListIn} that pass a given test Creates @var{ListOut} of all list elements of @var{ListIn} that pass a given test
@item selectlist(:@var{Pred}, +@var{ListIn}, +@var{ListInAux}, ?@var{ListOut})
@findex selectlist/3
@snindex selectlist/3
@cnindex selectlist/3
Creates @var{ListOut} of all list elements of @var{ListIn} that
pass the given test @var{Pred} using +@var{ListInAux} as an
auxiliary element.
@item convlist(:@var{Pred}, +@var{ListIn}, ?@var{ListOut}) @item convlist(:@var{Pred}, +@var{ListIn}, ?@var{ListOut})
@findex convlist/3 @findex convlist/3
@snindex convlist/3 @snindex convlist/3

View File

@ -13,6 +13,7 @@
:- module(maplist, [selectlist/3, :- module(maplist, [selectlist/3,
selectlist/4,
checklist/2, checklist/2,
maplist/2, % :Goal, +List maplist/2, % :Goal, +List
maplist/3, % :Goal, ?List1, ?List2 maplist/3, % :Goal, ?List1, ?List2
@ -47,6 +48,7 @@
:- meta_predicate :- meta_predicate
selectlist(2,+,-), selectlist(2,+,-),
selectlist(3,+,+,-),
checklist(1,+), checklist(1,+),
maplist(1,+), maplist(1,+),
maplist(2,+,-), maplist(2,+,-),
@ -105,6 +107,15 @@ selectlist(Pred, [In|ListIn], ListOut) :-
), ),
selectlist(Pred, ListIn, NewListOut). selectlist(Pred, ListIn, NewListOut).
selectlist(_, [], [], []).
selectlist(Pred, [In|ListIn], [In1|ListIn1], ListOut) :-
(call(Pred, In, In1) ->
ListOut = [In|NewListOut]
;
ListOut = NewListOut
),
selectlist(Pred, ListIn, ListIn1, NewListOut).
exclude(_, [], []). exclude(_, [], []).
exclude(Pred, [In|ListIn], ListOut) :- exclude(Pred, [In|ListIn], ListOut) :-
(call(Pred, In) -> (call(Pred, In) ->
@ -570,6 +581,29 @@ goal_expansion(selectlist(Meta, ListIn, ListOut), Mod:Goal) :-
RecursiveCall) RecursiveCall)
], Mod). ], Mod).
goal_expansion(selectlist(Meta, ListIn, ListIn1, ListOut), Mod:Goal) :-
goal_expansion_allowed,
callable(Meta),
prolog_load_context(module, Mod),
aux_preds(Meta, MetaVars, Pred, PredVars, Proto),
!,
% the new goal
pred_name(selectlist, 3, Proto, GoalName),
append(MetaVars, [ListIn, ListIn1, ListOut], GoalArgs),
Goal =.. [GoalName|GoalArgs],
% the new predicate declaration
HeadPrefix =.. [GoalName|PredVars],
append_args(HeadPrefix, [[], [], []], Base),
append_args(HeadPrefix, [[In|Ins], [In1|Ins1], Outs], RecursionHead),
append_args(Pred, [In, In1], Apply),
append_args(HeadPrefix, [Ins, Ins1, NOuts], RecursiveCall),
compile_aux([
Base,
(RecursionHead :-
(Apply -> Outs = [In|NOuts]; Outs = NOuts),
RecursiveCall)
], Mod).
% same as selectlist % same as selectlist
goal_expansion(include(Meta, ListIn, ListOut), Mod:Goal) :- goal_expansion(include(Meta, ListIn, ListOut), Mod:Goal) :-
goal_expansion_allowed, goal_expansion_allowed,