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