let rec ltl_form_to_string = function
| LNext (f) ->
"X("^(ltl_form_to_string f)^")"
| LUntil (f1,f2) ->
"("^(ltl_form_to_string f1)^" U "^(ltl_form_to_string f2)^")"
| LFatally (f) ->
"<>("^(ltl_form_to_string f)^")"
| LGlobally (f) ->
"[]("^(ltl_form_to_string f)^")"
| LRelease (f1,f2) ->
"("^(ltl_form_to_string f1)^" V "^(ltl_form_to_string f2)^")"
| LNot (f) ->
"!("^(ltl_form_to_string f)^")"
| LAnd (f1,f2) ->
"("^(ltl_form_to_string f1)^" && "^(ltl_form_to_string f2)^")"
| LOr (f1,f2) ->
"("^(ltl_form_to_string f1)^" || "^(ltl_form_to_string f2)^")"
| LImplies (f1,f2) ->
"("^(ltl_form_to_string f1)^" -> "^(ltl_form_to_string f2)^")"
| LIff (f1,f2) ->
"("^(ltl_form_to_string f1)^" <-> "^(ltl_form_to_string f2)^")"
| LTrue ->
"1"
| LFalse ->
"0"
| LCall (s) ->
"callof_"^s
| LReturn (s) ->
"returnof_"^s
| LCallOrReturn (s) ->
"callorreturnof_"^s
| LIdent (s) ->
s