shorter include/3 and exclude/3, relying on improved indexing

This commit is contained in:
Markus Triska
2023-09-08 22:40:50 +02:00
parent efcc2b81cd
commit 672979c515

View File

@@ -1949,29 +1949,21 @@ Compatibility predicates.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
include(Goal, List, Is) :- include(_, [], []).
include_(List, Goal, Is). include(Goal, [L|Ls0], Ls) :-
( call(Goal, L) ->
include_([], _, []). Ls = [L|Rest]
include_([X1|Xs1], P, Is) :- ; Ls = Rest
( call(P, X1)
-> Is = [X1|Is1]
; Is = Is1
), ),
include_(Xs1, P, Is1). include(Goal, Ls0, Rest).
exclude(_, [], []).
exclude(Goal, List, Is) :- exclude(Goal, [L|Ls0], Ls) :-
exclude_(List, Goal, Is). ( call(Goal, L) ->
Ls = Rest
exclude_([], _, []). ; Ls = [L|Rest]
exclude_([X1|Xs1], P, Is) :-
( call(P, X1)
-> Is = Is1
; Is = [X1|Is1]
), ),
exclude_(Xs1, P, Is1). exclude(Goal, Ls0, Rest).
partition(Pred, List, Less, Equal, Greater) :- partition(Pred, List, Less, Equal, Greater) :-
partition_(List, Pred, Less, Equal, Greater). partition_(List, Pred, Less, Equal, Greater).