Следующая реализация сохраняет логическую чистоту . Он основан на:
Давайте перейдем прямо к коду!
list_list_symdiffset([],Ys,Zs) :-
list_setB(Ys,Zs).
list_list_symdiffset([X|Xs0],Ys0,Zs0) :-
tpartition(=(X),Ys0,Es,Ys1),
if_(Es=[], Zs0=[X|Zs1], Zs0=Zs1),
tfilter(not_t(=(X)),Xs0,Xs1),
list_list_symdiffset(Xs1,Ys1,Zs1).
Давайте запустим пример запроса, заданного OP:
?- list_list_symdiffset([a,b,p,l,a,f],[q,a,z,x,l],Rs).
Rs = [b,p,f,q,z,x]. % succeeds deterministically
Наконец, давайте попробуем что-нибудь более общее!
?- list_list_symdiffset([A,B],[X,Y],Ys).
Ys = [], A=B, B=X, X=Y ;
Ys = [B], A=X, X=Y, dif(Y,B) ;
Ys = [Y], A=B, B=X, dif(X,Y) ;
Ys = [], A=X, B=Y, dif(X,Y), dif(X,Y) ;
Ys = [B,Y], A=X, dif(X,B), dif(X,Y), dif(B,Y) ;
Ys = [X], A=B, B=Y, dif(Y,X) ;
Ys = [], A=Y, B=X, dif(Y,X), dif(Y,X) ;
Ys = [B,X], A=Y, dif(Y,B), dif(Y,X), dif(B,X) ;
Ys = [B,Y], A=B, X = Y, dif(B,Y), dif(B,Y) ;
Ys = [B,X,Y], A=B, dif(B,Y), dif(B,X), dif(X,Y) ;
Ys = [A], B=X, X=Y, dif(A,Y), dif(A,Y),dif(A,Y) ;
Ys = [A,Y], B=X, dif(A,X), dif(A,Y), dif(A,X), dif(X,Y) ;
Ys = [A,X], B=Y, dif(A,Y), dif(A,Y), dif(A,X), dif(Y,X) ;
Ys = [A,B,Y], X=Y, dif(A,B), dif(A,Y), dif(A,Y), dif(B,Y), dif(B,Y) ;
Ys = [A,B,X,Y], dif(A,B), dif(A,Y), dif(A,X), dif(B,Y), dif(B,X), dif(X,Y).