let rec is_same_expression e1 e2 =
match e1,e2 with
| PVar x, PVar y -> x = y
| PVar _,_ | _,PVar _ -> false
| PCst cst1, PCst cst2 -> Logic_utils.is_same_pconstant cst1 cst2
| PCst _,_ | _,PCst _ -> false
| PPrm (f1,x1), PPrm(f2,x2) -> f1 = x1 && f2 = x2
| PPrm _,_ | _,PPrm _ -> false
| PBinop(b1,l1,r1), PBinop(b2,l2,r2) ->
b1 = b2 && is_same_expression l1 l2 && is_same_expression r1 r2
| PBinop _, _ | _, PBinop _ -> false
| PUnop(u1,e1), PUnop(u2,e2) -> u1 = u2 && is_same_expression e1 e2
| PUnop _,_ | _,PUnop _ -> false
| PArrget(a1,i1), PArrget(a2,i2) ->
is_same_expression a1 a2 && is_same_expression i1 i2
| PArrget _,_ | _,PArrget _ -> false
| PField(e1,f1), PField(e2,f2) -> f1 = f2 && is_same_expression e1 e2
| PField _,_ | _,PField _ -> false
| PArrow(e1,f1), PArrow(e2,f2) -> f1 = f2 && is_same_expression e1 e2