How to compare/3 without surprises on non-ground terms?

I appreciate if you could give me an example of lists of rational terms
to test functionality of semi_lex_sort.

% ?- semi_lex_sort([a,b,a], X).
% ?- A=f(A), B=f(B), semi_lex_sort([A, B], X).
% ?- A=f(A, 0), B=f(B,1), C=f(C, 2), semi_lex_sort([A, B, C], X).
% ?- A=f(A, 0), B=f(B,1), C=f(C, 2), semi_lex_sort([C, B, A, A, B, C], X).
%@ A = f(A, 0),
%@ B = f(B, 1),
%@ C = f(C, 2),

semi_lex_sort(X, Y):- b_setval(compare_history, []),
					  predsort(semi_lex_compare, X, Y).


semi_lex_compare(C, X, Y):- b_getval(compare_history, H),
					compare_with_stack(C, X, Y, H, H0),
					b_setval(compare_history, H0).

Yes, of course.

% ?- b_setval(compare_history, H), A=f(A, 0), semi_lex_compare(C, A, A).
%@ A = f(A, 0),
%@ C = (=).