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

fun o/0.
fun s/1.
fun p/1.
fun exp/2.
fun mult/2.
fun e/2.
fun a/0.
fun b/0.
fun c/0.
fun sec/0.
fun h/1.
fun msk/0.

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)  ->  i0:x;
i0:x  ->  i0:exp(x, o);
i0:(msk, y1, exp(x, x1))  ->  i0:exp(x, y1);

i0:mult(x, o)  ->  i0:x;
i0:x  ->  i0:mult(x, o);
i0:(msk, y1, mult(x, x1))  ->  i0:mult(x, y1);

add: x1,y1,z1 &
i0:(mult(x, x1), mult(y, y1))  ->  i0:exp(e(x,y), z1);

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

nexp: x, msk, exp(x, s(o)); 
nexp: exp(x, p(o)), msk, x; 
nexp: exp(x, x1), msk, exp(x, s(x1)); 
nexp: exp(x, p(x1)), msk, exp(x, x1); 

nrexp: x, msk, exp(x, p(o)); 
nrexp: exp(x, s(o)), msk, x; 
nrexp: exp(x, x1), msk, exp(x, p(x1)); 
nrexp: exp(x, s(x1)), msk, exp(x, x1); 

nmult: x, msk, mult(x, s(o)); 
nmult: mult(x, p(o)), msk, x; 
nmult: mult(x, x1), msk, mult(x, s(x1)); 
nmult: mult(x, p(x1)), msk, mult(x, x1); 

nrmult: x, msk, mult(x, p(o)); 
nrmult: mult(x, s(o)), msk, x; 
nrmult: mult(x, x1), msk, mult(x, p(x1)); 
nrmult: mult(x, s(x1)), msk, mult(x, x1); 

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

add: x1,y1,z1 -> 
npair: mult(x, x1), mult(y, y1), exp(e(x,y), z1); 

add: x1,y1,o -> 
npair: mult(x, x1), mult(y, y1), e(x,y); 

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

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

i0:a;

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

i0:b;

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

i0:c;

  (*    rule:  i0:X->i0:h(X) *)
  (* aux.var: *)
  (*  result:  i0:X->i0:h(X) *)

i0:X  ->  i0:h(X);

  (*    rule:  i0:h(c)*msk *)
  (* aux.var: *)
  (*  result:  i0:mult(h(c), s(o)) *)

i0:mult(h(c), s(o));

  (*    rule:  i0:e_(h(a)*msk, h(b))->i0:sec *)
  (* aux.var: *)
  (*  result:  i0:exp(e(h(a), h(b)), s(o))->i0:sec *)

i0:exp(e(h(a), h(b)), s(o))  ->  i0:sec;

  (*    rule:  i0:e_(h(b)*msk, h(a))->i0:sec *)
  (* aux.var: *)
  (*  result:  i0:exp(e(h(b), h(a)), s(o))->i0:sec *)

i0:exp(e(h(b), h(a)), s(o))  ->  i0:sec;

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