基于 TA_intern 提出的 find 中间算法:
%! list_without_middle(SOURCEs,TARGETs)
list_without_middle(SOURCEs,TARGETs)
:-
list_middle(SOURCEs,_MIDDLE_,PREFIXs,SUFFIXs) ,
lists:append(PREFIXs,SUFFIXs,TARGETs)
.
%! list_middle(LISTs,MIDDLE,PREFIXs,SUFFIXs)
list_middle([ITEM|LISTs],MIDDLE,PREFIXs,SUFFIXs)
:-
list_middle(LISTs,LISTs,ITEM,MIDDLE,PREFIXs,SUFFIXs)
.
%! list_middle(FASTs,SLOWs,ITEM,MIDDLE,PREFIXs,SUFFIXs)
list_middle([],SLOWs,ITEM,ITEM,[],SLOWs) .
list_middle([_,_|FASTs],[ITEM|SLOWs],PREVIOUS_ITEM,MIDDLE,[PREVIOUS_ITEM|PREFIXs],SUFFIXs)
:-
list_middle(FASTs,SLOWs,ITEM,MIDDLE,PREFIXs,SUFFIXs)
.
?- list_without_middle([a,b,c],Ys).
Ys = [a, c].
?- list_without_middle([a,c],Ys).
false.
?- list_without_middle([a,b,c,d,e],Ys).
Ys = [a, b, d, e].
?-
?- list_without_middle(Xs,Ys) .
Xs = [_924],
Ys = [] ;
Xs = [_924, _930, _936],
Ys = [_924, _936] ;
Xs = [_924, _930, _936, _948, _954],
Ys = [_924, _930, _948, _954] %.e.t.c.
?- list_middle([a,b,c],MIDDLE,PREFIXs,SUFFIXs).
MIDDLE = b,
PREFIXs = [a],
SUFFIXs = [c].
?- list_middle([a,c],MIDDLE,PREFIXs,SUFFIXs).
false.
?- list_middle([a,b,c,d,e],MIDDLE,PREFIXs,SUFFIXs).
MIDDLE = c,
PREFIXs = [a, b],
SUFFIXs = [d, e].
?-
?- list_without_middle(Ls,[]) .
Ls = [_4364] ;
ERROR: Out of global stack
?- list_without_middle([a],Ys).
Ys = [].
?- dif(A,B) , list_without_middle([A|_],[B|_]) .
ERROR: Out of global stack
?-