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