kkp_expression2(empty) :- !,kkp_opexpr(empty,[]).
kkp_expression2(iden) :- !,kkp_opexpr(iden,[]).
kkp_expression2(univ) :- !,kkp_opexpr(univ,[]).
kkp_expression2(transpose(E)) :- !,kkp_opexpr(transpose,[E]).
kkp_expression2(closure(E)) :- !,kkp_opexpr(closure,[E]).
kkp_expression2(reflexive_closure(E)) :-!,kkp_opexpr(reflexive_closure,[E]).
kkp_expression2(union(A,B)) :- !,kkp_fopexpr(union,union(A,B)).
kkp_expression2(intersection(A,B)) :- !,kkp_fopexpr(intersection,intersection(A,B)).
kkp_expression2(difference(A,B)) :- !,kkp_opexpr(difference,[A,B]).
kkp_expression2(join(A,B)) :- !,kkp_opexpr(join,[A,B]).
kkp_expression2(product(A,B)) :- !,kkp_fopexpr(product,product(A,B)).
kkp_expression2(overwrite(A,B)) :- !,kkp_opexpr(overwrite,[A,B]).
kkp_expression2(relref(I)) :- !,kprint([t('relref '),id(I)]).
kkp_expression2(varref(I)) :- !,kprint([t('varref '),id(I)]).
kkp_expression2(comp(Decls,Formula)) :- !,kkp_quantifier(comp, Decls, Formula).
kkp_expression2(prj(Is,Expr)) :- !,kprint(t(prj)),kkp_ints(Is),kkp_expression(Expr).
kkp_expression2(int2pow2(E)) :- !,kkp_opexpr(int2pow2,[E]).
kkp_expression2(int2intset(E)) :- !,kkp_opexpr(int2intset,[E]).
kkp_expression2(if(Cond,Then,Else)) :- !,kprint(t(if)),kkp_formula(Cond),kkp_expression_l([Then,Else]).
kkp_expression2(card(E)) :- !,kkp_opexpr(card,[E]).
kkp_expression2(add(A,B)) :- !,kkp_opexpr(add,[A,B]).
kkp_expression2(sub(A,B)) :- !,kkp_opexpr(sub,[A,B]).
kkp_expression2(mul(A,B)) :- !,kkp_opexpr(mul,[A,B]).
kkp_expression2(div(A,B)) :- !,kkp_opexpr(div,[A,B]).
kkp_expression2(floored_div(A,B)) :- !, add_warning(kodkod_printer,'Translating floored division as truncated division: ',div(A,B)),
kkp_opexpr(div,[A,B]).
kkp_expression2(mod(A,B)) :- !,kkp_opexpr(mod,[A,B]).
kkp_expression2(sum(E)) :- !,kkp_opexpr(expr2int,[E]).
kkp_expression2(expr2int(E)) :- !,kkp_opexpr(expr2int,[E]).
kkp_expression2(int(I)) :- !,kprint(t(I)).
kkp_expression2(E) :- throw(unknown_construct(expression,E)).