diff --git a/src/lib/CoAlgFormula.ml b/src/lib/CoAlgFormula.ml index 3d561d030e07994b02250a7ef12e3adc2184004d..1a6997fbc0e9804cea2b8e8c1812283f28a34eea 100644 --- a/src/lib/CoAlgFormula.ml +++ b/src/lib/CoAlgFormula.ml @@ -69,6 +69,8 @@ type formula = | EU of formula * formula | AR of formula * formula | ER of formula * formula + | AB of formula * formula + | EB of formula * formula exception ConversionException of formula @@ -123,7 +125,8 @@ let rec sizeFormula f = | AF _ | EF _ | AG _ | EG _ | AU _ | EU _ - | AR _ | ER _ -> + | AR _ | ER _ + | AB _ | EB _ -> raise (CoAlgException ("sizeFormula: CTL should have been removed at this point")) (** Determines the size of a sorted formula. @@ -156,7 +159,9 @@ let rec iter func formula = | FUS (_,a) -> proc a | MU (_, f) | NU (_, f) -> proc f | AF f | EF f | AG f | EG f -> proc f - | AU (f1, f2) | EU (f1, f2) | AR (f1, f2) | ER (f1, f2) -> (proc f1; proc f2) + | AU (f1, f2) | EU (f1, f2) + | AR (f1, f2) | ER (f1, f2) + | AB (f1, f2) | EB (f1, f2) -> (proc f1; proc f2) let rec convert_post func formula = (* run over all subformulas in post order *) let c = convert_post func in (* some shorthand *) @@ -198,7 +203,9 @@ let rec convert_post func formula = (* run over all subformulas in post order *) | AU (f1, f2) -> AU (c f1, c f2) | EU (f1, f2) -> EU (c f1, c f2) | AR (f1, f2) -> AR (c f1, c f2) - | ER (f1, f2) -> ER (c f1, c f2)) + | ER (f1, f2) -> ER (c f1, c f2) + | AB (f1, f2) -> AB (c f1, c f2) + | EB (f1, f2) -> EB (c f1, c f2)) in func formula @@ -254,7 +261,10 @@ let convertToMu formula = NU ("#AR#", (AND (f2, (OR (f1, (AX ("", (VAR "#AR#")))))))) | ER (f1, f2) -> NU ("#ER#", (AND (f2, (OR (f1, (EX ("", (VAR "#ER#")))))))) - + | AB (f1, f2) -> + NOT (MU ("#AB#", (OR (f2, (AND ((NOT f1), (AX ("", (VAR "#AU#"))))))))) + | EB (f1, f2) -> + NOT (MU ("#EB#", (OR (f2, (AND ((NOT f1), (EX ("", (VAR "#EU#"))))))))) | _ -> formula in convert_post helper formula @@ -455,6 +465,18 @@ let rec exportFormula_buffer sb f = Buffer.add_string sb " R "; prio 4 f2; Buffer.add_string sb ")" + | AB (f1, f2) -> + Buffer.add_string sb "A ("; + prio 4 f1; + Buffer.add_string sb " B "; + prio 4 f2; + Buffer.add_string sb ")" + | EB (f1, f2) -> + Buffer.add_string sb "E ("; + prio 4 f1; + Buffer.add_string sb " B "; + prio 4 f2; + Buffer.add_string sb ")" (** Converts a formula into a string representation. @@ -552,7 +574,9 @@ let rec exportTatlFormula_buffer sb f = | AU _ | EU _ | AR _ - | ER _ -> raise (CoAlgException ("export to tatl: Not connectives of CL")) + | ER _ + | AB _ + | EB _ -> raise (CoAlgException ("export to tatl: Not connectives of CL")) let exportTatlFormula f = let sb = Buffer.create 128 in @@ -694,7 +718,7 @@ let rec verifyMuAltFree formula = else ("ν", newfree) | VAR s -> ("none", [s]) - | AF _ | EF _ | AG _ | EG _ | AU _ | EU _ | AR _ | ER _ -> + | AF _ | EF _ | AG _ | EG _ | AU _ | EU _ | AR _ | ER _ | AB _ | EB _ -> raise (CoAlgException ("verifyMuAltFree: CTL should have been removed at this point")) @@ -733,7 +757,7 @@ let rec verifyMuMonotone negations formula = let increment (s, n) = (s, n+1) in let newNeg = List.map increment negations in verifyMuMonotone newNeg a - | AF _ | EF _ | AG _ | EG _ | AU _ | EU _ | AR _ | ER _ -> + | AF _ | EF _ | AG _ | EG _ | AU _ | EU _ | AR _ | ER _ | AB _ | EB _ -> raise (CoAlgException ("verifyMuMonotone: CTL should have been removed at this point")) let rec verifyMuGuarded unguarded formula = @@ -762,7 +786,7 @@ let rec verifyMuGuarded unguarded formula = let finder x = compare x s == 0 in if List.exists finder unguarded then raise (CoAlgException ("formula not guarded")) - | AF _ | EF _ | AG _ | EG _ | AU _ | EU _ | AR _ | ER _ -> + | AF _ | EF _ | AG _ | EG _ | AU _ | EU _ | AR _ | ER _ | AB _ | EB _ -> raise (CoAlgException ("verifyMuGuarded: CTL should have been removed at this point")) let verifyFormula formula = @@ -1029,7 +1053,7 @@ and parse_rest symtab ts = | A.Kwd "B" -> let f2 = parse_formula symtab ts in assert (Stream.next ts = A.Kwd ")"); - AR (f2, f1) + AB (f1, f2) | t -> A.printError mk_exn ~t ~ts "one of \"U\" \"R\" \"B\" expected: " end | A.Kwd "E" -> @@ -1047,7 +1071,7 @@ and parse_rest symtab ts = | A.Kwd "B" -> let f2 = parse_formula symtab ts in assert (Stream.next ts = A.Kwd ")"); - ER (f2, f1) + EB (f1, f2) | t -> A.printError mk_exn ~t ~ts "one of \"U\" \"R\" \"B\" expected: " end | A.Kwd "AX" -> @@ -1196,14 +1220,11 @@ let rec nnfNeg f = | FUS (first, f1) -> FUS (first, nnfNeg f1) | MU (s, f1) -> NU(s, nnfNeg f1) | NU (s, f1) -> MU(s, nnfNeg f1) - | AF _ - | EF _ - | AG _ - | EG _ - | AU _ - | EU _ - | AR _ - | ER _ -> raise (CoAlgException ("nnfNeg: CTL should have been removed at this point")) + | AF _ | EF _ + | AG _ | EG _ + | AU _ | EU _ + | AR _ | ER _ + | AB _ | EB _ -> raise (CoAlgException ("nnfNeg: CTL should have been removed at this point")) (** Converts a formula to negation normal form by "pushing in" the negations "~". @@ -1291,14 +1312,12 @@ and nnf f = | NU (s, f1) -> let ft = nnf f1 in if ft == f1 then f else NU (s, ft) - | AF _ - | EF _ - | AG _ - | EG _ - | AU _ - | EU _ - | AR _ - | ER _ -> raise (CoAlgException ("nnf: CTL should have been removed at this point")) + | AF _ | EF _ + | AG _ | EG _ + | AU _ | EU _ + | AR _ | ER _ + | AB _ | EB _ -> + raise (CoAlgException ("nnf: CTL should have been removed at this point")) (** Simplifies a formula. @param f A formula which must be in negation normal form. @@ -1485,15 +1504,12 @@ let rec simplify f = | TRUE -> TRUE | _ -> if ft == f1 then f else NU (s, ft) end - | AF _ - | EF _ - | AG _ - | EG _ - | AU _ - | EU _ - | AR _ - | ER _ -> - raise (CoAlgException ("nnf: CTL should have been removed at this point")) + | AF _ | EF _ + | AG _ | EG _ + | AU _ | EU _ + | AR _ | ER _ + | AB _ | EB _ -> + raise (CoAlgException ("nnf: CTL should have been removed at this point")) (** Destructs an atomic proposition. @param f An atomic proposition. @@ -2195,14 +2211,11 @@ let rec hc_formula hcF f = | NU (var, f1) -> let tf1 = hc_formula hcF f1 in HcFormula.hashcons hcF (HCNU (var, tf1)) - | AF _ - | EF _ - | AG _ - | EG _ - | AU _ - | EU _ - | AR _ - | ER _ -> + | AF _ | EF _ + | AG _ | EG _ + | AU _ | EU _ + | AR _ | ER _ + | AB _ | EB _ -> raise (CoAlgException ("nnf: CTL should have been removed at this point")) (* Replace the Variable name in f with formula formula diff --git a/src/lib/CoAlgFormula.mli b/src/lib/CoAlgFormula.mli index ff89471442d0d181b9181b27b1039c8e1c4880dc..7ea6b0f8515081bc7f0cddc6218f7433ba4af04e 100644 --- a/src/lib/CoAlgFormula.mli +++ b/src/lib/CoAlgFormula.mli @@ -52,6 +52,8 @@ type formula = | EU of formula * formula | AR of formula * formula | ER of formula * formula + | AB of formula * formula + | EB of formula * formula exception ConversionException of formula