let rec termsAreEqual term1 term2 =
match term1,term2 with
| PTrue,PTrue
| PFalse,PFalse -> true
| PCall(a),PCall(b)
| PReturn(a),PReturn(b)
| PCallOrReturn(a),PCallOrReturn(b) -> (String.compare a b)=0
| PIndexedExp(a),PIndexedExp(b) ->
expAreEqual a b
| PNot(a),PNot(b) -> termsAreEqual a b
| PFuncReturn (h1, f1), PFuncReturn (h2, f2) -> (String.compare f1 f2)=0 && (expAreEqual h1 h2)
| PFuncParam (h1, f1, p1), PFuncParam (h2, f2, p2) -> (String.compare f1 f2)=0 && (expAreEqual h1 h2) && p1=p2
| _ -> false