1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
|
/* $Id: apply.pl,v 1.3 1998/11/30 15:13:17 jan Exp $
Copyright (c) 1990 Jan Wielemaker. All rights reserved.
jan@swi.psy.uva.nl
Purpose: calling predicates
*/
:- module($apply, [
checklist/2,
maplist/3,
sublist/3,
forall/2]).
:- module_transparent
checklist/2,
checklist2/2,
maplist/3,
maplist2/3,
sublist/3,
forall/2.
% checklist(+Goal, +List)
%
% True if Goal can succesfully be applied on all elements of List.
% Arguments are reordered to gain performance as well as to make
% the predicate deterministic under normal circumstances.
checklist(Goal, List) :-
checklist2(List, Goal).
checklist2([], _).
checklist2([Elem|Tail], Goal) :-
call(Goal, Elem),
checklist2(Tail, Goal).
% maplist(+Goal, +List1, ?List2)
% True if Goal can succesfully be applied to all succesive pairs
% of elements of List1 and List2.
maplist(Goal, List1, List2) :-
maplist2(List1, List2, Goal).
maplist2([], [], _).
maplist2([Elem1|Tail1], [Elem2|Tail2], Goal) :-
call(Goal, Elem1, Elem2),
maplist2(Tail1, Tail2, Goal).
% sublist(+Goal, +List1, ?List2)
% Succeeds if List2 unifies with a list holding those terms for wich
% apply(Goal, Elem) succeeds.
sublist(_, [], []) :- !.
sublist(Goal, [H|T], Sub) :-
call(Goal, H), !,
Sub = [H|R],
sublist(Goal, T, R).
sublist(Goal, [_|T], R) :-
sublist(Goal, T, R).
% forall(+Condition, +Action)
% True if Action if true for all variable bindings for which Condition
% if true.
forall(Cond, Action) :-
\+ (Cond, \+ Action).
|