(* This file is generated automatically by protocol transformer without using types from c:/proverif/Done_3/Joux/Joux.pl *)

fun o/0.
fun s/1.
fun p/1.
fun exp/5.
fun mult/5.
fun e/2.
fun a/0.
fun b/0.
fun c/0.
fun d/0.
fun point/0.
fun sec/0.
fun n/1.

pred nexp/3 elimVar,decompData.
pred nrexp/3 elimVar,decompData.
pred nmult/3 elimVar,decompData.
pred nrmult/3 elimVar,decompData.
pred npair/3 elimVar,decompData.
pred incr/2 elimVar,decompData.
pred decr/2 elimVar,decompData.
pred add/3 elimVar,decompData.
pred i/1 elimVar,decompData.
nounif i:x.
pred i0/1 elimVar,decompData.
nounif i0:x.

equation e(x,y) = e(y,x).

query i0:sec.

reduc

(***** Phase rules: *****)

(***** Intruder rules: *****)
i0:o;
i0:x -> i0:s(x);
i0:x -> i0:p(x);
i0:exp(x, o, o, o, o)  ->  i0:x;
i0:x  ->  i0:exp(x, o, o, o, o);
i0:(n(a), y1, exp(x, x1, x2, x3, x4))  ->  i0:exp(x, y1, x2, x3, x4);
i0:(n(b), y2, exp(x, x1, x2, x3, x4))  ->  i0:exp(x, x1, y2, x3, x4);
i0:(n(c), y3, exp(x, x1, x2, x3, x4))  ->  i0:exp(x, x1, x2, y3, x4);
i0:(n(d), y4, exp(x, x1, x2, x3, x4))  ->  i0:exp(x, x1, x2, x3, y4);

i0:mult(x, o, o, o, o)  ->  i0:x;
i0:x  ->  i0:mult(x, o, o, o, o);
i0:(n(a), y1, mult(x, x1, x2, x3, x4))  ->  i0:mult(x, y1, x2, x3, x4);
i0:(n(b), y2, mult(x, x1, x2, x3, x4))  ->  i0:mult(x, x1, y2, x3, x4);
i0:(n(c), y3, mult(x, x1, x2, x3, x4))  ->  i0:mult(x, x1, x2, y3, x4);
i0:(n(d), y4, mult(x, x1, x2, x3, x4))  ->  i0:mult(x, x1, x2, x3, y4);

add: x1,y1,z1 & add: x2,y2,z2 & add: x3,y3,z3 & add: x4,y4,z4 &
i0:(mult(x, x1, x2, x3, x4), mult(y, y1, y2, y3, y4))  ->  i0:exp(e(x,y), z1, z2, z3, z4);

(***** Normalisation rules: *****)

nexp: x, n(a), exp(x, s(o), o, o, o); 
nexp: exp(x, p(o), o, o, o), n(a), x; 
nexp: exp(x, x1, x2, x3, x4), n(a), exp(x, s(x1), x2, x3, x4); 
nexp: exp(x, p(x1), x2, x3, x4), n(a), exp(x, x1, x2, x3, x4); 
nexp: x, n(b), exp(x, o, s(o), o, o); 
nexp: exp(x, o, p(o), o, o), n(b), x; 
nexp: exp(x, x1, x2, x3, x4), n(b), exp(x, x1, s(x2), x3, x4); 
nexp: exp(x, x1, p(x2), x3, x4), n(b), exp(x, x1, x2, x3, x4); 
nexp: x, n(c), exp(x, o, o, s(o), o); 
nexp: exp(x, o, o, p(o), o), n(c), x; 
nexp: exp(x, x1, x2, x3, x4), n(c), exp(x, x1, x2, s(x3), x4); 
nexp: exp(x, x1, x2, p(x3), x4), n(c), exp(x, x1, x2, x3, x4); 
nexp: x, n(d), exp(x, o, o, o, s(o)); 
nexp: exp(x, o, o, o, p(o)), n(d), x; 
nexp: exp(x, x1, x2, x3, x4), n(d), exp(x, x1, x2, x3, s(x4)); 
nexp: exp(x, x1, x2, x3, p(x4)), n(d), exp(x, x1, x2, x3, x4); 

nrexp: x, n(a), exp(x, p(o), o, o, o); 
nrexp: exp(x, s(o), o, o, o), n(a), x; 
nrexp: exp(x, x1, x2, x3, x4), n(a), exp(x, p(x1), x2, x3, x4); 
nrexp: exp(x, s(x1), x2, x3, x4), n(a), exp(x, x1, x2, x3, x4); 
nrexp: x, n(b), exp(x, o, p(o), o, o); 
nrexp: exp(x, o, s(o), o, o), n(b), x; 
nrexp: exp(x, x1, x2, x3, x4), n(b), exp(x, x1, p(x2), x3, x4); 
nrexp: exp(x, x1, s(x2), x3, x4), n(b), exp(x, x1, x2, x3, x4); 
nrexp: x, n(c), exp(x, o, o, p(o), o); 
nrexp: exp(x, o, o, s(o), o), n(c), x; 
nrexp: exp(x, x1, x2, x3, x4), n(c), exp(x, x1, x2, p(x3), x4); 
nrexp: exp(x, x1, x2, s(x3), x4), n(c), exp(x, x1, x2, x3, x4); 
nrexp: x, n(d), exp(x, o, o, o, p(o)); 
nrexp: exp(x, o, o, o, s(o)), n(d), x; 
nrexp: exp(x, x1, x2, x3, x4), n(d), exp(x, x1, x2, x3, p(x4)); 
nrexp: exp(x, x1, x2, x3, s(x4)), n(d), exp(x, x1, x2, x3, x4); 

nmult: x, n(a), mult(x, s(o), o, o, o); 
nmult: mult(x, p(o), o, o, o), n(a), x; 
nmult: mult(x, x1, x2, x3, x4), n(a), mult(x, s(x1), x2, x3, x4); 
nmult: mult(x, p(x1), x2, x3, x4), n(a), mult(x, x1, x2, x3, x4); 
nmult: x, n(b), mult(x, o, s(o), o, o); 
nmult: mult(x, o, p(o), o, o), n(b), x; 
nmult: mult(x, x1, x2, x3, x4), n(b), mult(x, x1, s(x2), x3, x4); 
nmult: mult(x, x1, p(x2), x3, x4), n(b), mult(x, x1, x2, x3, x4); 
nmult: x, n(c), mult(x, o, o, s(o), o); 
nmult: mult(x, o, o, p(o), o), n(c), x; 
nmult: mult(x, x1, x2, x3, x4), n(c), mult(x, x1, x2, s(x3), x4); 
nmult: mult(x, x1, x2, p(x3), x4), n(c), mult(x, x1, x2, x3, x4); 
nmult: x, n(d), mult(x, o, o, o, s(o)); 
nmult: mult(x, o, o, o, p(o)), n(d), x; 
nmult: mult(x, x1, x2, x3, x4), n(d), mult(x, x1, x2, x3, s(x4)); 
nmult: mult(x, x1, x2, x3, p(x4)), n(d), mult(x, x1, x2, x3, x4); 

nrmult: x, n(a), mult(x, p(o), o, o, o); 
nrmult: mult(x, s(o), o, o, o), n(a), x; 
nrmult: mult(x, x1, x2, x3, x4), n(a), mult(x, p(x1), x2, x3, x4); 
nrmult: mult(x, s(x1), x2, x3, x4), n(a), mult(x, x1, x2, x3, x4); 
nrmult: x, n(b), mult(x, o, p(o), o, o); 
nrmult: mult(x, o, s(o), o, o), n(b), x; 
nrmult: mult(x, x1, x2, x3, x4), n(b), mult(x, x1, p(x2), x3, x4); 
nrmult: mult(x, x1, s(x2), x3, x4), n(b), mult(x, x1, x2, x3, x4); 
nrmult: x, n(c), mult(x, o, o, p(o), o); 
nrmult: mult(x, o, o, s(o), o), n(c), x; 
nrmult: mult(x, x1, x2, x3, x4), n(c), mult(x, x1, x2, p(x3), x4); 
nrmult: mult(x, x1, x2, s(x3), x4), n(c), mult(x, x1, x2, x3, x4); 
nrmult: x, n(d), mult(x, o, o, o, p(o)); 
nrmult: mult(x, o, o, o, s(o)), n(d), x; 
nrmult: mult(x, x1, x2, x3, x4), n(d), mult(x, x1, x2, x3, p(x4)); 
nrmult: mult(x, x1, x2, x3, s(x4)), n(d), mult(x, x1, x2, x3, x4); 

incr: o, s(o);
incr: s(x), s(s(x));
incr: p(x), x;

decr: o, p(o);
decr: p(x), p(p(x));
decr: s(x), x;

add: x, o, x;

add: x, y, z & incr: z, w  -> add: x, s(y), w;
add: x, y, z & decr: z, w  -> add: x, p(y), w;

npair: x, y, e(x,y); 
npair: mult(x, x1, x2, x3, x4),  y, exp(e(x,y), x1, x2, x3, x4); 
npair:  y, mult(x, x1, x2, x3, x4), exp(e(x,y), x1, x2, x3, x4); 

add: x1,y1,z1 & add: x2,y2,z2 & add: x3,y3,z3 & add: x4,y4,z4 -> 
npair: mult(x, x1, x2, x3, x4), mult(y, y1, y2, y3, y4), exp(e(x,y), z1, z2, z3, z4); 

add: x1,y1,o & add: x2,y2,o & add: x3,y3,o & add: x4,y4,o -> 
npair: mult(x, x1, x2, x3, x4), mult(y, y1, y2, y3, y4), e(x,y); 

(***** User rules: *****)

  (*    rule:  i0:point *)
  (* aux.var: *)
  (*  result:  i0:point *)

i0:point;

  (*    rule:  i0:point*n(a) *)
  (* aux.var: *)
  (*  result:  i0:mult(point, s(o), o, o, o) *)

i0:mult(point, s(o), o, o, o);

  (*    rule:  i0:point*n(b) *)
  (* aux.var: *)
  (*  result:  i0:mult(point, o, s(o), o, o) *)

i0:mult(point, o, s(o), o, o);

  (*    rule:  i0:point*n(c) *)
  (* aux.var: *)
  (*  result:  i0:mult(point, o, o, s(o), o) *)

i0:mult(point, o, o, s(o), o);

  (*    rule:  i0:point*n(d) *)
  (* aux.var: *)
  (*  result:  i0:mult(point, o, o, o, s(o)) *)

i0:mult(point, o, o, o, s(o));

  (*    rule:  i0:n(d) *)
  (* aux.var: *)
  (*  result:  i0:n(d) *)

i0:n(d);

  (*    rule:  i0:e_(point*n(a), point*n(b))^n(c)->i0:sec *)
  (* aux.var: *)
  (*  result:  i0:exp(e(point, point), s(o), s(o), s(o), o)->i0:sec *)

i0:exp(e(point, point), s(o), s(o), s(o), o)  ->  i0:sec;

  (*    rule:  i0:e_(point*n(a), point*n(c))^n(b)->i0:sec *)
  (* aux.var: *)
  (*  result:  i0:exp(e(point, point), s(o), s(o), s(o), o)->i0:sec *)

i0:exp(e(point, point), s(o), s(o), s(o), o)  ->  i0:sec;

  (*    rule:  i0:e_(point*n(b), point*n(a))^n(c)->i0:sec *)
  (* aux.var: *)
  (*  result:  i0:exp(e(point, point), s(o), s(o), s(o), o)->i0:sec *)

i0:exp(e(point, point), s(o), s(o), s(o), o)  ->  i0:sec;

  (*    rule:  i0:e_(point*n(b), point*n(c))^n(a)->i0:sec *)
  (* aux.var: *)
  (*  result:  i0:exp(e(point, point), s(o), s(o), s(o), o)->i0:sec *)

i0:exp(e(point, point), s(o), s(o), s(o), o)  ->  i0:sec;

  (*    rule:  i0:e_(point*n(c), point*n(a))^n(b)->i0:sec *)
  (* aux.var: *)
  (*  result:  i0:exp(e(point, point), s(o), s(o), s(o), o)->i0:sec *)

i0:exp(e(point, point), s(o), s(o), s(o), o)  ->  i0:sec;

  (*    rule:  i0:e_(point*n(c), point*n(b))^n(a)->i0:sec *)
  (* aux.var: *)
  (*  result:  i0:exp(e(point, point), s(o), s(o), s(o), o)->i0:sec *)

i0:exp(e(point, point), s(o), s(o), s(o), o)  ->  i0:sec;

(***** End of User rules *****)
i:x -> i:x.
