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)