let isCrossable tr func st =
let rec isCross p =
match p with
| POr (c1, c2) -> bool3or (isCross c1) (isCross c2)
| PAnd (c1, c2) -> bool3and (isCross c1) (isCross c2)
| PNot (c1) -> bool3not (isCross c1)
| PCall (s) -> if func=s && st=Call then True else False
| PReturn (s) -> if func=s && st=Return then True else False
| PCallOrReturn (s) -> if func=s then True else False
| PTrue -> True
| PFalse -> False
(* | PGt (_,_)
| PGe (_,_)
| PLt (_,_)
| PLe (_,_)
| PEq (_,_)
| PNeq (_,_)
| PBoolVar (_) -> Undefined*)
| PIndexedExp (_) -> Undefined
in
(isCross tr.cross)<>False