predicates([t1,t2,box,dia,p,q]).

t1(X,X).
 t2(X,X).
 t1(X,Y) -> t1(Y,X).
 t2(X,Y) -> t2(Y,X).
 t1(X,Y),t1(Y,Z) -> t1(X,Z).
 t2(X,Y),t2(Y,Z) -> t2(X,Z).
/*
 t2(X,Z),t1(Z,Y) -> t1(X,f1(X,Y)).
 t2(X,Z),t1(Z,Y) -> t2(f1(X,Y),Y).
 t1(X,X1),t2(X1,Y) -> t2(X,f2(X,Y)).
 t1(X,X1),t2(X1,Y) -> t1(f2(X,Y),Y).
*/
 t1(X,Y),t2(X,Y) -> X=Y.
 p(X2,X),q(X,X3) -> t1(X3,f3(X2,X4,X3)).
 p(X2,X),q(X,X3) -> t2(f3(X2,X4,X3),X2).
 p(X2,X),q(X,X3) -> dia(X2,f3(X2,X4,X3)).
 dia(X5,X6) -> p(X5,f5(X5,X6)).
 dia(X5,X6) -> q(f5(X5,X6),f4(X5,X6)).
 dia(X5,X6) -> t1(f4(X5,X6),X6).
/*
 t1(f6(X7,X8),X8),t2(f7(X7,X8),f6(X7,X8)) -> p(X7,f7(X7,X8)),box(X7,X8).
 t1(f6(X7,X8),X8),t2(f7(X7,X8),f6(X7,X8)),q(f7(X7,X8),f6(X7,X8)) -> box(X7,X8).
*/
 box(X9,X10) -> t2(X10,X9).
 box(X9,X10),p(X9,X) -> q(X,f8(X9,X10,X)).
 box(X9,X10),p(X9,X) -> t1(f8(X9,X10,X),X10).
 p(X,Y) -> t1(X,Y).
 q(X,Y) -> t2(X,Y).
 box(X,Y) -> t2(X,Y).
 dia(X,Y) -> t2(X,Y).


first_predicate_precedence([t1,t2]).
precedence([f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,p,q,box,dia]).

:-option([
%	  select(_,p(_,_)== _),
%	  select(_,q(_,_)== _),
	  select(t1(_,_),t1(_,_)),select(t2(_,_),t1(_,_)),
%	  select(_,t1(_,_)),
	  select(t1(_,_),t2(_,_)),select(t2(_,_),t2(_,_))
%	  select(_,t2(_,_))	
]).
