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

fun o/0.
fun s/1.
fun p/1.
fun exp/7.
fun mult/7.
fun e/2.
fun a/0.
fun b/0.
fun c/0.
fun d/0.
fun point/0.
fun secret/0.
fun n1/1.
fun n2/1.
fun enc/2.
fun cert/2.

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:secret.

reduc

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

(***** Intruder rules: *****)
i0:o;
i0:x -> i0:s(x);
i0:x -> i0:p(x);
i0:exp(x, o, o, o, o, o, o)  ->  i0:x;
i0:x  ->  i0:exp(x, o, o, o, o, o, o);
i0:(n1(a), y1, exp(x, x1, x2, x3, x4, x5, x6))  ->  i0:exp(x, y1, x2, x3, x4, x5, x6);
i0:(n1(b), y2, exp(x, x1, x2, x3, x4, x5, x6))  ->  i0:exp(x, x1, y2, x3, x4, x5, x6);
i0:(n1(c), y3, exp(x, x1, x2, x3, x4, x5, x6))  ->  i0:exp(x, x1, x2, y3, x4, x5, x6);
i0:(n2(a), y4, exp(x, x1, x2, x3, x4, x5, x6))  ->  i0:exp(x, x1, x2, x3, y4, x5, x6);
i0:(n2(b), y5, exp(x, x1, x2, x3, x4, x5, x6))  ->  i0:exp(x, x1, x2, x3, x4, y5, x6);
i0:(n2(c), y6, exp(x, x1, x2, x3, x4, x5, x6))  ->  i0:exp(x, x1, x2, x3, x4, x5, y6);

i0:mult(x, o, o, o, o, o, o)  ->  i0:x;
i0:x  ->  i0:mult(x, o, o, o, o, o, o);
i0:(n1(a), y1, mult(x, x1, x2, x3, x4, x5, x6))  ->  i0:mult(x, y1, x2, x3, x4, x5, x6);
i0:(n1(b), y2, mult(x, x1, x2, x3, x4, x5, x6))  ->  i0:mult(x, x1, y2, x3, x4, x5, x6);
i0:(n1(c), y3, mult(x, x1, x2, x3, x4, x5, x6))  ->  i0:mult(x, x1, x2, y3, x4, x5, x6);
i0:(n2(a), y4, mult(x, x1, x2, x3, x4, x5, x6))  ->  i0:mult(x, x1, x2, x3, y4, x5, x6);
i0:(n2(b), y5, mult(x, x1, x2, x3, x4, x5, x6))  ->  i0:mult(x, x1, x2, x3, x4, y5, x6);
i0:(n2(c), y6, mult(x, x1, x2, x3, x4, x5, x6))  ->  i0:mult(x, x1, x2, x3, x4, x5, y6);

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

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

nexp: x, n1(a), exp(x, s(o), o, o, o, o, o); 
nexp: exp(x, p(o), o, o, o, o, o), n1(a), x; 
nexp: exp(x, x1, x2, x3, x4, x5, x6), n1(a), exp(x, s(x1), x2, x3, x4, x5, x6); 
nexp: exp(x, p(x1), x2, x3, x4, x5, x6), n1(a), exp(x, x1, x2, x3, x4, x5, x6); 
nexp: x, n1(b), exp(x, o, s(o), o, o, o, o); 
nexp: exp(x, o, p(o), o, o, o, o), n1(b), x; 
nexp: exp(x, x1, x2, x3, x4, x5, x6), n1(b), exp(x, x1, s(x2), x3, x4, x5, x6); 
nexp: exp(x, x1, p(x2), x3, x4, x5, x6), n1(b), exp(x, x1, x2, x3, x4, x5, x6); 
nexp: x, n1(c), exp(x, o, o, s(o), o, o, o); 
nexp: exp(x, o, o, p(o), o, o, o), n1(c), x; 
nexp: exp(x, x1, x2, x3, x4, x5, x6), n1(c), exp(x, x1, x2, s(x3), x4, x5, x6); 
nexp: exp(x, x1, x2, p(x3), x4, x5, x6), n1(c), exp(x, x1, x2, x3, x4, x5, x6); 
nexp: x, n2(a), exp(x, o, o, o, s(o), o, o); 
nexp: exp(x, o, o, o, p(o), o, o), n2(a), x; 
nexp: exp(x, x1, x2, x3, x4, x5, x6), n2(a), exp(x, x1, x2, x3, s(x4), x5, x6); 
nexp: exp(x, x1, x2, x3, p(x4), x5, x6), n2(a), exp(x, x1, x2, x3, x4, x5, x6); 
nexp: x, n2(b), exp(x, o, o, o, o, s(o), o); 
nexp: exp(x, o, o, o, o, p(o), o), n2(b), x; 
nexp: exp(x, x1, x2, x3, x4, x5, x6), n2(b), exp(x, x1, x2, x3, x4, s(x5), x6); 
nexp: exp(x, x1, x2, x3, x4, p(x5), x6), n2(b), exp(x, x1, x2, x3, x4, x5, x6); 
nexp: x, n2(c), exp(x, o, o, o, o, o, s(o)); 
nexp: exp(x, o, o, o, o, o, p(o)), n2(c), x; 
nexp: exp(x, x1, x2, x3, x4, x5, x6), n2(c), exp(x, x1, x2, x3, x4, x5, s(x6)); 
nexp: exp(x, x1, x2, x3, x4, x5, p(x6)), n2(c), exp(x, x1, x2, x3, x4, x5, x6); 

nrexp: x, n1(a), exp(x, p(o), o, o, o, o, o); 
nrexp: exp(x, s(o), o, o, o, o, o), n1(a), x; 
nrexp: exp(x, x1, x2, x3, x4, x5, x6), n1(a), exp(x, p(x1), x2, x3, x4, x5, x6); 
nrexp: exp(x, s(x1), x2, x3, x4, x5, x6), n1(a), exp(x, x1, x2, x3, x4, x5, x6); 
nrexp: x, n1(b), exp(x, o, p(o), o, o, o, o); 
nrexp: exp(x, o, s(o), o, o, o, o), n1(b), x; 
nrexp: exp(x, x1, x2, x3, x4, x5, x6), n1(b), exp(x, x1, p(x2), x3, x4, x5, x6); 
nrexp: exp(x, x1, s(x2), x3, x4, x5, x6), n1(b), exp(x, x1, x2, x3, x4, x5, x6); 
nrexp: x, n1(c), exp(x, o, o, p(o), o, o, o); 
nrexp: exp(x, o, o, s(o), o, o, o), n1(c), x; 
nrexp: exp(x, x1, x2, x3, x4, x5, x6), n1(c), exp(x, x1, x2, p(x3), x4, x5, x6); 
nrexp: exp(x, x1, x2, s(x3), x4, x5, x6), n1(c), exp(x, x1, x2, x3, x4, x5, x6); 
nrexp: x, n2(a), exp(x, o, o, o, p(o), o, o); 
nrexp: exp(x, o, o, o, s(o), o, o), n2(a), x; 
nrexp: exp(x, x1, x2, x3, x4, x5, x6), n2(a), exp(x, x1, x2, x3, p(x4), x5, x6); 
nrexp: exp(x, x1, x2, x3, s(x4), x5, x6), n2(a), exp(x, x1, x2, x3, x4, x5, x6); 
nrexp: x, n2(b), exp(x, o, o, o, o, p(o), o); 
nrexp: exp(x, o, o, o, o, s(o), o), n2(b), x; 
nrexp: exp(x, x1, x2, x3, x4, x5, x6), n2(b), exp(x, x1, x2, x3, x4, p(x5), x6); 
nrexp: exp(x, x1, x2, x3, x4, s(x5), x6), n2(b), exp(x, x1, x2, x3, x4, x5, x6); 
nrexp: x, n2(c), exp(x, o, o, o, o, o, p(o)); 
nrexp: exp(x, o, o, o, o, o, s(o)), n2(c), x; 
nrexp: exp(x, x1, x2, x3, x4, x5, x6), n2(c), exp(x, x1, x2, x3, x4, x5, p(x6)); 
nrexp: exp(x, x1, x2, x3, x4, x5, s(x6)), n2(c), exp(x, x1, x2, x3, x4, x5, x6); 

nmult: x, n1(a), mult(x, s(o), o, o, o, o, o); 
nmult: mult(x, p(o), o, o, o, o, o), n1(a), x; 
nmult: mult(x, x1, x2, x3, x4, x5, x6), n1(a), mult(x, s(x1), x2, x3, x4, x5, x6); 
nmult: mult(x, p(x1), x2, x3, x4, x5, x6), n1(a), mult(x, x1, x2, x3, x4, x5, x6); 
nmult: x, n1(b), mult(x, o, s(o), o, o, o, o); 
nmult: mult(x, o, p(o), o, o, o, o), n1(b), x; 
nmult: mult(x, x1, x2, x3, x4, x5, x6), n1(b), mult(x, x1, s(x2), x3, x4, x5, x6); 
nmult: mult(x, x1, p(x2), x3, x4, x5, x6), n1(b), mult(x, x1, x2, x3, x4, x5, x6); 
nmult: x, n1(c), mult(x, o, o, s(o), o, o, o); 
nmult: mult(x, o, o, p(o), o, o, o), n1(c), x; 
nmult: mult(x, x1, x2, x3, x4, x5, x6), n1(c), mult(x, x1, x2, s(x3), x4, x5, x6); 
nmult: mult(x, x1, x2, p(x3), x4, x5, x6), n1(c), mult(x, x1, x2, x3, x4, x5, x6); 
nmult: x, n2(a), mult(x, o, o, o, s(o), o, o); 
nmult: mult(x, o, o, o, p(o), o, o), n2(a), x; 
nmult: mult(x, x1, x2, x3, x4, x5, x6), n2(a), mult(x, x1, x2, x3, s(x4), x5, x6); 
nmult: mult(x, x1, x2, x3, p(x4), x5, x6), n2(a), mult(x, x1, x2, x3, x4, x5, x6); 
nmult: x, n2(b), mult(x, o, o, o, o, s(o), o); 
nmult: mult(x, o, o, o, o, p(o), o), n2(b), x; 
nmult: mult(x, x1, x2, x3, x4, x5, x6), n2(b), mult(x, x1, x2, x3, x4, s(x5), x6); 
nmult: mult(x, x1, x2, x3, x4, p(x5), x6), n2(b), mult(x, x1, x2, x3, x4, x5, x6); 
nmult: x, n2(c), mult(x, o, o, o, o, o, s(o)); 
nmult: mult(x, o, o, o, o, o, p(o)), n2(c), x; 
nmult: mult(x, x1, x2, x3, x4, x5, x6), n2(c), mult(x, x1, x2, x3, x4, x5, s(x6)); 
nmult: mult(x, x1, x2, x3, x4, x5, p(x6)), n2(c), mult(x, x1, x2, x3, x4, x5, x6); 

nrmult: x, n1(a), mult(x, p(o), o, o, o, o, o); 
nrmult: mult(x, s(o), o, o, o, o, o), n1(a), x; 
nrmult: mult(x, x1, x2, x3, x4, x5, x6), n1(a), mult(x, p(x1), x2, x3, x4, x5, x6); 
nrmult: mult(x, s(x1), x2, x3, x4, x5, x6), n1(a), mult(x, x1, x2, x3, x4, x5, x6); 
nrmult: x, n1(b), mult(x, o, p(o), o, o, o, o); 
nrmult: mult(x, o, s(o), o, o, o, o), n1(b), x; 
nrmult: mult(x, x1, x2, x3, x4, x5, x6), n1(b), mult(x, x1, p(x2), x3, x4, x5, x6); 
nrmult: mult(x, x1, s(x2), x3, x4, x5, x6), n1(b), mult(x, x1, x2, x3, x4, x5, x6); 
nrmult: x, n1(c), mult(x, o, o, p(o), o, o, o); 
nrmult: mult(x, o, o, s(o), o, o, o), n1(c), x; 
nrmult: mult(x, x1, x2, x3, x4, x5, x6), n1(c), mult(x, x1, x2, p(x3), x4, x5, x6); 
nrmult: mult(x, x1, x2, s(x3), x4, x5, x6), n1(c), mult(x, x1, x2, x3, x4, x5, x6); 
nrmult: x, n2(a), mult(x, o, o, o, p(o), o, o); 
nrmult: mult(x, o, o, o, s(o), o, o), n2(a), x; 
nrmult: mult(x, x1, x2, x3, x4, x5, x6), n2(a), mult(x, x1, x2, x3, p(x4), x5, x6); 
nrmult: mult(x, x1, x2, x3, s(x4), x5, x6), n2(a), mult(x, x1, x2, x3, x4, x5, x6); 
nrmult: x, n2(b), mult(x, o, o, o, o, p(o), o); 
nrmult: mult(x, o, o, o, o, s(o), o), n2(b), x; 
nrmult: mult(x, x1, x2, x3, x4, x5, x6), n2(b), mult(x, x1, x2, x3, x4, p(x5), x6); 
nrmult: mult(x, x1, x2, x3, x4, s(x5), x6), n2(b), mult(x, x1, x2, x3, x4, x5, x6); 
nrmult: x, n2(c), mult(x, o, o, o, o, o, p(o)); 
nrmult: mult(x, o, o, o, o, o, s(o)), n2(c), x; 
nrmult: mult(x, x1, x2, x3, x4, x5, x6), n2(c), mult(x, x1, x2, x3, x4, x5, p(x6)); 
nrmult: mult(x, x1, x2, x3, x4, x5, s(x6)), n2(c), mult(x, x1, x2, x3, x4, x5, x6); 

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, x5, x6),  y, exp(e(x,y), x1, x2, x3, x4, x5, x6); 
npair:  y, mult(x, x1, x2, x3, x4, x5, x6), exp(e(x,y), x1, x2, x3, x4, x5, x6); 

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

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

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

  (*    rule:  i0:cert(X, Y)->i0: (X, Y) *)
  (* aux.var: *)
  (*  result:  i0:cert(X, Y)->i0: (X, Y) *)

i0:cert(X, Y)  ->  i0:(X, Y);

  (*    rule:  i0: (X, Y)->i0:enc(X, Y) *)
  (* aux.var: *)
  (*  result:  i0: (X, Y)->i0:enc(X, Y) *)

i0:(X, Y)  ->  i0:enc(X, Y);

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

i0:point;

  (*    rule:  i0: (X, enc(X, Y))->i0:Y *)
  (* aux.var: *)
  (*  result:  i0: (X, enc(X, Y))->i0:Y *)

i0:(X, enc(X, Y))  ->  i0:Y;

  (*    rule:  i0:X->i0:cert(d, X) *)
  (* aux.var: *)
  (*  result:  i0:X->i0:cert(d, X) *)

i0:X  ->  i0:cert(d, X);

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

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

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

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

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

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

  (*    rule:  i0: ((X, Y, cert(Z, A1)), B1, C1, cert(D1, E1))->i0:enc(e_(Y, C1)^n1(a)^n2(a), secret) *)
  (* aux.var:  x1 = e_(Y, C1)^n1(a)^n2(a), x2 = e_(Y, C1)^n1(a), x3 = e_(Y, C1) *)
  (*  result:  i0: ((X, Y, cert(Z, A1)), B1, C1, cert(D1, E1))->i0:enc(x1, secret) *)

nexp:x2,n2(a),x1 & nexp:x3,n1(a),x2 & npair:Y,C1,x3 &
i0:((X, Y, cert(Z, A1)), B1, C1, cert(D1, E1))  ->  i0:enc(x1, secret);

  (*    rule:  i0: ((X, Y, cert(Z, A1)), B1, C1, cert(D1, E1))->i0:enc(e_(Y, C1)^n1(b)^n2(b), secret) *)
  (* aux.var:  x1 = e_(Y, C1)^n1(b)^n2(b), x2 = e_(Y, C1)^n1(b), x3 = e_(Y, C1) *)
  (*  result:  i0: ((X, Y, cert(Z, A1)), B1, C1, cert(D1, E1))->i0:enc(x1, secret) *)

nexp:x2,n2(b),x1 & nexp:x3,n1(b),x2 & npair:Y,C1,x3 &
i0:((X, Y, cert(Z, A1)), B1, C1, cert(D1, E1))  ->  i0:enc(x1, secret);

  (*    rule:  i0: ((X, Y, cert(Z, A1)), B1, C1, cert(D1, E1))->i0:enc(e_(Y, C1)^n1(c)^n2(c), secret) *)
  (* aux.var:  x1 = e_(Y, C1)^n1(c)^n2(c), x2 = e_(Y, C1)^n1(c), x3 = e_(Y, C1) *)
  (*  result:  i0: ((X, Y, cert(Z, A1)), B1, C1, cert(D1, E1))->i0:enc(x1, secret) *)

nexp:x2,n2(c),x1 & nexp:x3,n1(c),x2 & npair:Y,C1,x3 &
i0:((X, Y, cert(Z, A1)), B1, C1, cert(D1, E1))  ->  i0:enc(x1, secret);

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