, dcg s. - , . , :
grab_tentative(Xs, Ys, Zs) :-
phrase((seq(Ys),seq(Zs)), Xs).
seq([]) --> [].
seq([E|Es]) --> [E], seq(Es).
grab_tentative/3 , Xs Ys, Zs. , .
?- Xs = [A,B,C], grab_tentative(Xs,Ys,Zs).
Xs = Zs, Zs = [A, B, C], Ys = []
; Xs = [A, B, C], Ys = [A], Zs = [B, C]
; Xs = [A, B, C], Ys = [A, B], Zs = [C]
; Xs = Ys, Ys = [A, B, C], Zs = []
; false.
, Ys = [], ( @Sarah), Ys , :
grab_tentative(Xs, Ys, Zs) :-
Ys = [_|_],
phrase((seq(Ys),seq(Zs)), Xs).
Xs = [A, B, C], Ys = [A, B], Zs = [C]
Xs = Ys, Ys = [A, B, C], Zs = []
, A B . , :
grab_tentative(Xs, Ys, Zs) :-
Ys = [A|_],
phrase((all_seq(=(A),Ys),seq(Zs)), Xs).
all_seq(_, []) --> [].
all_seq(C_1, [C|Cs]) -->
[C],
{call(C_1,C)},
all_seq(C_1, Cs).
:
?- Xs = [A,B,C], grab_tentative(Xs,Ys,Zs).
Xs = [A, B, C], Ys = [A], Zs = [B, C]
; Xs = [B, B, C], A = B, Ys = [B, B], Zs = [C]
; Xs = Ys, Ys = [C, C, C], A = B, B = C, Zs = []
; false.
, A = B. dif(A,B). . . , or_end//1 []//0, , .
grab_final(Xs, Ys, Zs) :-
Ys = [A|_],
phrase ((all_seq (= (A), Ys), or_end (dif (A)) , seq (Zs)), Xs).
or_end (C_1) ->
call (cond_or_end (C_1)). % interface to predicates
cond_or_end (_C_1, [], []).
cond_or_end (C_1, [E | Es], [E | Es]): -
Now the answers respond as follows:
?- Xs = [A,B,C], grab_final(Xs, Ys, Zs).
Xs = [A, B, C], Ys = [A], Zs = [B, C], dif(A, B)
; Xs = [B, B, C], A = B, Ys = [B, B], Zs = [C], dif(B, C)
; Xs = Ys, Ys = [C, C, C], A = B, B = C, Zs = []
; false.