1:- module(term_util, [reverse_conjunction/2]).    2
    3gather_conjunction(Expr, Terms) :-
    4    Expr =.. [',', A, B] ->
    5    (
    6        not(functor(B, ',', _)) -> Terms = [A, B];
    7        gather_conjunction(B, RestTerms),
    8        Terms = [A | RestTerms]
    9    );
   10
   11    Terms = [Expr].
   12
   13build_conjunction(A, [A]).
   14build_conjunction((A,B), [A,B]).
   15build_conjunction(Expr, [A | Rest]) :-
   16    build_conjunction(RestExpr, Rest),
   17    Expr =.. [',', A, RestExpr].
   18
   19reverse_conjunction(Expr, Reversed) :-
   20    gather_conjunction(Expr, Terms),
   21    reverse(Terms, ReversedTerms),
   22    build_conjunction(Reversed, ReversedTerms).
   23
   24replace(A, B, A, B).
   25replace(A, _B, C, C) :- dif(A, C).
   26
   27replace_expr(A, B, A, B).
   28replace_expr(A, B, Expr, NewExpr) :-
   29    Expr =.. [V],
   30    replace(A, B, V, NewV), !,
   31    NewExpr =.. [NewV].
   32replace_expr(A, B, Expr, NewExpr) :-
   33    Expr =.. List,
   34    List = [_,_|_],
   35    maplist(replace_expr(A, B), List, TempList),
   36    maplist(replace(A, B), TempList, NewList), !,
   37    NewExpr =.. NewList.
   38
   39replace_expr_list([], _, Expr, Expr).
   40replace_expr_list(_, [], Expr, Expr).
   41replace_expr_list([V|Vs], [R|Rs], Expr, NewExpr) :-
   42    replace_expr(V, R, Expr, TempExpr), !,
   43    replace_expr_list(Vs, Rs, TempExpr, NewExpr).
   44
   45replace_equiv_list(Vs, Rs, A=B, NewA=NewB) :-
   46    replace_expr_list(Vs, Rs, A, NewA),
   47    replace_expr_list(Vs, Rs, B, NewB).
   48
   49expr_vars(Expr, [Expr]) :-
   50    functor(Expr, _, N),
   51    N = 0.
   52expr_vars(Expr, Vars) :-
   53    functor(Expr, _, N),
   54    N > 0,
   55    Expr =.. [_|Args],
   56    maplist(expr_vars, Args, AllVars),
   57    flatten(AllVars, Vars).
   58
   59term_length(A, Length) :-
   60    term_to_atom(A, Atom),
   61    atom_codes(Atom, Codes),
   62    length(Codes, Length).
   63
   64shorter(A, B, Shorter) :-
   65    term_length(A, LenA),
   66    term_length(B, LenB),
   67    (
   68        LenA < LenB,
   69        Shorter = A;
   70
   71        LenB < LenA,
   72        Shorter = B
   73    ).
   74
   75sub_exprs(Expr, Subs) :-
   76    Expr =.. [_|T],
   77    (
   78        T = [],
   79        SubExprs = [];
   80
   81        T = [_|_],
   82        maplist(sub_exprs, T, AllSubExprs),
   83        flatten(AllSubExprs, Temp),
   84        append(T, Temp, SubExprs)
   85    ),
   86    sort([Expr|SubExprs], Subs)