:- use_module(library(lists),[member/2]). tu(Goal) :- tu_goal(Goal,[],_). tu_goal((T1=T2,Goal),ToleranceIn,ToleranceOut) :- tu_terms(T1,T2,ToleranceIn,Tol), tu_goal(Goal,Tol,ToleranceOut). tu_goal(T1=T2,ToleranceIn,ToleranceOut) :- tu_terms(T1,T2,ToleranceIn,ToleranceOut). tu_terms(T1,T2,ToleranceIn,ToleranceOut) :- ( (special(T1) ; special(T2)) -> T1 = T2, ToleranceOut = ToleranceIn ; (atom(T1) ; atom(T2)) -> atom(T1), atom(T2), tolerance_lookup(T1,T2,ToleranceIn,ToleranceOut) ; (T1 = [_|_] ; T2 = [_|_]) -> T1 = [A1|R1], T2 = [A2|R2], tu_terms(A1,A2,ToleranceIn,Tol), tu_terms(R1,R2,Tol,ToleranceOut) ; functor(T1,N1,A), functor(T2,N2,A), tolerance_lookup(N1/A,N2/A,ToleranceIn,Tol), T1 =.. [_|As1], T2 =.. [_|As2], tu_terms(As1,As2,Tol,ToleranceOut) ). tolerance_lookup(X,Y,ToleranceIn,ToleranceOut) :- ( X = Y -> ToleranceOut = ToleranceIn ; member(X=YY,ToleranceIn) -> Y = YY, ToleranceOut = ToleranceIn ; member(Y=XX,ToleranceIn) -> X = XX, ToleranceOut = ToleranceIn ; ToleranceOut = [X=Y,Y=X|ToleranceIn] ). special(T) :- (var(T) ; number(T) ; T == []).