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 = (=).