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