diff --git a/prism/src/prism/StateModelChecker.java b/prism/src/prism/StateModelChecker.java index 2374c6e7..71ccc8ed 100644 --- a/prism/src/prism/StateModelChecker.java +++ b/prism/src/prism/StateModelChecker.java @@ -28,9 +28,11 @@ package prism; import java.io.File; import java.io.FileNotFoundException; +import java.util.HashMap; import java.util.List; import java.util.Set; import java.util.TreeSet; +import java.util.Vector; import mtbdd.PrismMTBDD; import dv.DoubleVector; @@ -40,6 +42,7 @@ import parser.*; import parser.ast.*; import parser.ast.ExpressionFilter.FilterOperator; import parser.type.*; +import parser.visitor.ReplaceLabels; // Base class for model checkers - does state-based evaluations (no temporal/probabilistic) @@ -1455,6 +1458,47 @@ public class StateModelChecker extends PrismComponent implements ModelChecker return resVals; } + /** + * Method for handling the recursive part of PCTL* checking, i.e., + * recursively checking maximal state subformulas and replacing them + * with labels and the corresponding satisfaction sets. + *
+ * Extracts maximal state formula from an LTL path formula, + * model checks them (with the current model checker and the current model) + * and replaces them with ExpressionLabel objects that correspond + * to freshly generated labels attached to the model. + *
+ * Returns the modified Expression. + * + * @param expr the expression (a path formula) + */ + public Expression handleMaximalStateFormulas(Expression expr) throws PrismException + { + Vector labelDD = new Vector(); + + // construct LTL model checker, using this model checker instance + // (which is specialised for the model type) for the recursive + // model checking computation + LTLModelChecker ltlMC = new LTLModelChecker(this); + + // check the maximal state subformulas and gather + // the satisfaction sets in labelBS, with index i + // in the vector corresponding to label Li in the + // returned formula + Expression exprNew = ltlMC.checkMaximalStateFormulas(this, model, expr.deepCopy(), labelDD); + + HashMap labelReplacements = new HashMap(); + for (int i=0; i < labelDD.size(); i++) { + String currentLabel = "L"+i; + // Attach satisfaction set for Li to the model, record necessary + // label renaming + String newLabel = model.addUniqueLabelDD("phi", labelDD.get(i), getDefinedLabelNames()); + labelReplacements.put(currentLabel, newLabel); + } + // rename the labels + return (Expression) exprNew.accept(new ReplaceLabels(labelReplacements)); + } + // Utility functions for symbolic model checkers /**