let isCrossable tr func st =
let rec isCross p =
match p with
| TOr (c1, c2) -> bool3or (isCross c1) (isCross c2)
| TAnd (c1, c2) -> bool3and (isCross c1) (isCross c2)
| TNot c1 -> bool3not (isCross c1)
| TCall (kf,None) when Kernel_function.equal func kf && st=Call -> True
| TCall (kf, Some _) when Kernel_function.equal func kf && st=Call ->
Undefined
| TCall _ -> False
| TReturn kf when Kernel_function.equal func kf && st=Return -> True
| TReturn _ -> False
| TTrue -> True
| TFalse -> False
| TRel _ -> Undefined
in
let cond,_ = tr.cross in
let res = isCross cond <> False in
Aorai_option.debug ~level:2 "Function %a %s-state, transition %s -> %s is%s possible" Kernel_function.pretty func
(if st=Call then "pre" else "post")
tr.start.Promelaast.name
tr.stop.Promelaast.name
(if res then "" else " NOT");
res