Changeset 4593 for trunk/library
- Timestamp:
- 11/18/08 03:37:21 (7 weeks ago)
- Location:
- trunk/library
- Files:
-
- 2 modified
Legend:
- Unmodified
- Added
- Removed
-
trunk/library/meta.lgt
r4485 r4593 4 4 5 5 :- info([ 6 version is 2. 2,7 date is 2008/1 0/5,6 version is 2.3, 7 date is 2008/11/18, 8 8 author is 'Paulo Moura', 9 9 comment is 'Some useful meta-predicates.']). 10 11 :- alias(metap, map/2, succeeds/2). 12 :- alias(metap, include/3, filter/3). 10 13 11 14 callable(Term) :- … … 14 17 atom(Functor). 15 18 16 :- meta_predicate( filter(1, *, *)).17 filter(_, [], []) :- !.18 filter(Closure, [Arg| Args], In) :-19 :- meta_predicate(include(1, *, *)). 20 include(_, [], []) :- !. 21 include(Closure, [Arg| Args], Included) :- 19 22 ( call(Closure, Arg) -> 20 In = [Arg| RIn]21 ; In = RIn23 Included = [Arg| Rest] 24 ; Included = Rest 22 25 ), 23 filter(Closure, Args, RIn). 26 include(Closure, Args, Rest). 27 28 :- meta_predicate(exclude(1, *, *)). 29 exclude(_, [], []) :- !. 30 exclude(Closure, [Arg| Args], Excluded) :- 31 ( call(Closure, Arg) -> 32 Excluded = Rest 33 ; Excluded = [Arg| Rest] 34 ), 35 exclude(Closure, Args, Rest). 24 36 25 37 :- meta_predicate(partition(1, *, *, *)). 26 38 partition(_, [], [], []) :- !. 27 partition(Closure, [Arg| Args], In , Out) :-39 partition(Closure, [Arg| Args], Included, Excluded) :- 28 40 ( call(Closure, Arg) -> 29 In = [Arg| RIn],30 Out = ROut31 ; In = RIn,32 Out = [Arg| ROut]41 Included = [Arg| RestIncluded], 42 Excluded = RestExcluded 43 ; Included = RestIncluded, 44 Excluded = [Arg| RestExcluded] 33 45 ), 34 partition(Closure, Args, R In, ROut).46 partition(Closure, Args, RestIncluded, RestExcluded). 35 47 36 48 :- meta_predicate(ignore(::)). … … 40 52 ; true 41 53 ). 54 55 :- meta_predicate(fold_left(3, *, *, *)). 56 fold_left(_, Result, [], Result). 57 fold_left(Closure, Acc, [Arg| Args], Result) :- 58 call(Closure, Acc, Arg, Acc2), 59 fold_left(Closure, Acc2, Args, Result). 60 61 :- meta_predicate(fold_right(3, *, *, *)). 62 fold_right(_, Result, [], Result). 63 fold_right(Closure, Acc, [Arg| Args], Result) :- 64 fold_right(Closure, Acc, Args, Acc2), 65 call(Closure, Arg, Acc2, Result). 66 67 :- meta_predicate(map(1, *)). 68 map(_, []). 69 map(Closure, [Head| Tail]) :- 70 call(Closure, Head), 71 map(Closure, Tail). 42 72 43 73 :- meta_predicate(map(2, *, *)). … … 59 89 map(Closure, As, Bs, Cs, Ds). 60 90 61 :- meta_predicate(succeeds(1, *)).62 succeeds(_, []).63 succeeds(Closure, [Head| Tail]) :-64 call(Closure, Head),65 succeeds(Closure, Tail).66 67 91 :- end_object. -
trunk/library/metap.lgt
r4485 r4593 3 3 4 4 :- info([ 5 version is 3. 1,6 date is 2008/1 0/5,5 version is 3.2, 6 date is 2008/11/18, 7 7 author is 'Paulo Moura', 8 8 comment is 'Useful meta-predicates protocol.']). … … 14 14 argnames is ['Term']]). 15 15 16 :- public( filter/3).17 :- meta_predicate( filter(1, *, *)).18 :- mode( filter(+callable, +list, -list), one).19 :- info( filter/3, [16 :- public(include/3). 17 :- meta_predicate(include(1, *, *)). 18 :- mode(include(+callable, +list, -list), one). 19 :- info(include/3, [ 20 20 comment is 'Returns a list of all list elements that satisfy a predicate.', 21 argnames is ['Closure', 'List', 'In']]). 21 argnames is ['Closure', 'List', 'Included']]). 22 23 :- public(exclude/3). 24 :- meta_predicate(exclude(1, *, *)). 25 :- mode(exclude(+callable, +list, -list), one). 26 :- info(exclude/3, [ 27 comment is 'Returns a list of all list elements that fail to satisfy a predicate.', 28 argnames is ['Closure', 'List', 'Excluded']]). 22 29 23 30 :- public(partition/4). … … 26 33 :- info(partition/4, [ 27 34 comment is 'Partition a list of elements in two lists using a predicate.', 28 argnames is ['Closure', 'List', 'In ', 'Out']]).35 argnames is ['Closure', 'List', 'Included', 'Excluded']]). 29 36 30 37 :- public(ignore/1). … … 34 41 comment is 'Calls Goal once but always succeeds, even if Goal fails.', 35 42 argnames is ['Goal']]). 43 44 :- public(fold_left/4). 45 :- meta_predicate(fold_left(3, *, *, *)). 46 :- mode(fold_left(+callable, ?term, +list, ?term), zero_or_more). 47 :- info(fold_left/4, [ 48 comment is 'List folding (left associative).', 49 argnames is ['Closure', 'Accumulator', 'List', 'Result']]). 50 51 :- public(fold_right/4). 52 :- meta_predicate(fold_right(3, *, *, *)). 53 :- mode(fold_right(+callable, ?term, +list, ?term), zero_or_more). 54 :- info(fold_right/4, [ 55 comment is 'List folding (right associative).', 56 argnames is ['Closure', 'Accumulator', 'List', 'Result']]). 57 58 :- public(map/2). 59 :- meta_predicate(map(1, *)). 60 :- mode(map(+callable, ?list), zero_or_more). 61 :- info(map/2, [ 62 comment is 'True if the predicate succeeds for each list element.', 63 argnames is ['Closure', 'List']]). 36 64 37 65 :- public(map/3). … … 56 84 argnames is ['Closure', 'List1', 'List2', 'List3', 'List4']]). 57 85 58 :- public(succeeds/2).59 :- meta_predicate(succeeds(1, *)).60 :- mode(succeeds(+callable, +list), zero_or_more).61 :- info(succeeds/2, [62 comment is 'True if the predicate succeeds for each list element.',63 argnames is ['Closure', 'List']]).64 65 86 :- end_protocol.
