From dbcce6121a9d72ca2974e6f7a73e27ceab5fde7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thorsten=20Wi=C3=9Fmann?= <uni@thorsten-wissmann.de> Date: Mon, 5 May 2014 13:16:29 +0200 Subject: [PATCH] Implement fuzzy formula conversion to K or GML --- src/lib/CoAlgFormula.ml | 68 ++++++++++++++++++++++++++++++++++++++++ src/lib/CoAlgFormula.mli | 11 +++++-- 2 files changed, 77 insertions(+), 2 deletions(-) diff --git a/src/lib/CoAlgFormula.ml b/src/lib/CoAlgFormula.ml index 3e5c6e1..8bcaef8 100644 --- a/src/lib/CoAlgFormula.ml +++ b/src/lib/CoAlgFormula.ml @@ -16,6 +16,9 @@ module Str = String *) exception CoAlgException of string +exception ConversionException + + (** Indicates the sort of a sorted formula *) type sort = int @@ -90,6 +93,71 @@ let rec sizeFormula f = let sizeSortedFormula f = sizeFormula (snd f) +let rec iter func formula = + func formula; + let proc = iter func in (* proc = "process" *) + match formula with + | TRUE | FALSE | AP _ -> () + | NOT a | AT (_,a) + | EX (_,a) | AX (_,a) -> proc a + | OR (a,b) | AND (a,b) + | EQU (a,b) | IMP (a,b) -> (proc a ; proc b) + | ENFORCES (_,a) | ALLOWS (_,a) + | MIN (_,_,a) | MAX (_,_,a) + | MORETHAN (_,_,a) | MAXEXCEPT (_,_,a) -> proc a + | CHC (a,b) | CHCN (a,b) -> (proc a ; proc b) + | FUS (_,a) -> proc a + +let rec convert_post func formula = (* run over all subformulas in post order *) + let c = convert_post func in (* some shorthand *) + (* replace parts of the formula *) + let formula = (match formula with + (* 0-ary constructors *) + | TRUE | FALSE | AP _ -> formula + (* unary *) + | NOT a -> NOT (c a) + | AT (s,a) -> AT (s,c a) + (* binary *) + | OR (a,b) -> OR (c a, c b) + | AND (a,b) -> AND (c a, c b) + | EQU (a,b) -> EQU (c a, c b) + | IMP (a,b) -> IMP (c a, c b) + | EX (s,a) -> EX (s,c a) + | AX (s,a) -> AX (s,c a) + | ENFORCES (s,a) -> ENFORCES (s,c a) + | ALLOWS (s,a) -> ALLOWS (s,c a) + | MIN (n,s,a) -> MIN (n,s,c a) + | MAX (n,s,a) -> MAX (n,s,c a) + | MORETHAN (n,s,a) -> MORETHAN (n,s,c a) + | MAXEXCEPT (n,s,a) -> MAXEXCEPT (n,s,c a) + | CHC (a,b) -> CHC (c a, c b) + | CHCN (a,b) -> CHCN (c a, c b) + | FUS (s,a) -> FUS (s, c a)) in + func formula + +let convertToK formula = (* tries to convert a formula to a pure K formula *) + let helper formula = match formula with + | ENFORCES _ | ALLOWS _ -> raise ConversionException + | MORETHAN (0,s,a) | MIN (1,s,a) -> EX (s,a) + | MAX (0,s,a) -> AX (s, NOT a) + | MAXEXCEPT (0,s,a) -> AX (s, a) + | AX _ | EX _ + | CHC _ | CHCN _ | FUS _ -> formula + | _ -> raise ConversionException + in + convert_post helper formula + +let convertToGML formula = (* tries to convert a formula to a pure GML formula *) + let helper formula = match formula with + | ENFORCES _ | ALLOWS _ -> raise ConversionException + | MORETHAN _ | MIN _ | MAX _ | MAXEXCEPT _ -> formula + | CHC _ | CHCN _ | FUS _ -> formula + | AX (r,a) -> MAXEXCEPT (0,r,a) + | EX (r,a) -> MORETHAN (0,r,a) + | _ -> raise ConversionException + in + convert_post helper formula + (** Appends a string representation of a formula to a string buffer. Parentheses are ommited where possible where the preference rules are defined as usual. diff --git a/src/lib/CoAlgFormula.mli b/src/lib/CoAlgFormula.mli index 308e8b9..87a6c6c 100644 --- a/src/lib/CoAlgFormula.mli +++ b/src/lib/CoAlgFormula.mli @@ -6,6 +6,8 @@ exception CoAlgException of string +exception ConversionException + type sort = int type formula = @@ -25,13 +27,18 @@ type formula = | MIN of int * string * formula (* some more intuitive diamond for GML *) | MAX of int * string * formula (* some more intuitive box for GML *) | MORETHAN of int * string * formula (* diamond of GML *) - | MAXEXCEPT of int * string * formula (* box of GML *) + | MAXEXCEPT of int * string * formula (* box of GML, means: ¬>_nR.¬C *) | CHC of formula * formula | CHCN of formula * formula | FUS of bool * formula type sortedFormula = sort * formula +val iter : (formula -> unit) -> formula -> unit (* iterate over all sub formulas *) +val convert_post : (formula -> formula) -> formula -> formula (* run over all subformulas in post order *) +val convertToK : formula -> formula (* tries to convert a formula to a pure K formula *) +val convertToGML : formula -> formula (* tries to convert a formula to a pure GML formula *) + val isNominal : string -> bool val sizeFormula : formula -> int @@ -82,7 +89,7 @@ val is_min : formula -> bool val is_max : formula -> bool val is_choice : formula -> bool val is_fusion : formula -> bool - + val const_true : formula val const_false : formula val const_ap : string -> formula -- GitLab