diff --git a/prism/src/explicit/LTLModelChecker.java b/prism/src/explicit/LTLModelChecker.java index eb396142..34fb2994 100644 --- a/prism/src/explicit/LTLModelChecker.java +++ b/prism/src/explicit/LTLModelChecker.java @@ -55,6 +55,7 @@ import prism.PrismComponent; import prism.PrismException; import prism.PrismLangException; import prism.PrismNotSupportedException; +import prism.PrismPaths; import prism.PrismUtils; import acceptance.AcceptanceBuchi; import acceptance.AcceptanceGenRabin; @@ -129,6 +130,7 @@ public class LTLModelChecker extends PrismComponent if (!expr.isPathFormula(true)) { return false; } + if (Expression.containsTemporalTimeBounds(expr)) { if (modelType.continuousTime()) { // Only support temporal bounds for discrete time models @@ -140,6 +142,10 @@ public class LTLModelChecker extends PrismComponent return false; } } + + if (Expression.isHOA(expr)) + return true; + return true; } @@ -236,14 +242,33 @@ public class LTLModelChecker extends PrismComponent } } - // Model check maximal state formulas - ltl = checkMaximalStateFormulas(mc, model, expr.deepCopy(), labelBS); + if (Expression.isHOA(expr)) { + LTL2DA ltl2da = new LTL2DA(this); + time = System.currentTimeMillis(); + mainLog.println("Parsing and constructing HOA automaton for "+expr); + PrismPaths paths = new PrismPaths(mc.getModulesFile(), + mc.getPropertiesFile()); + Vector apExpressions = new Vector(); + da = ltl2da.fromExpressionHOA(expr, paths, apExpressions, allowedAcceptance); + + mainLog.println("Determining states satisfying atomic proposition labels of the automaton..."); + for (int i=0; i constructDAForLTLFormula(ModelChecker mc, Model model, Expression expr, Vector labelDDs, AcceptanceType... allowedAcceptance) throws PrismException + public DA constructDAForLTLFormula(StateModelChecker mc, Model model, Expression expr, Vector labelDDs, AcceptanceType... allowedAcceptance) throws PrismException { if (Expression.containsTemporalTimeBounds(expr)) { if (model.getModelType().continuousTime()) { @@ -320,15 +325,37 @@ public class LTLModelChecker extends PrismComponent throw new PrismException("Time-bounded operators not supported in LTL: " + expr); } } + + long time; + DA da; - // Model check maximal state formulas - Expression ltl = checkMaximalStateFormulas(mc, model, expr.deepCopy(), labelDDs); - - // Convert LTL formula to deterministic automaton (DA) - mainLog.println("\nBuilding deterministic automaton (for " + ltl + ")..."); - long time = System.currentTimeMillis(); - LTL2DA ltl2da = new LTL2DA(this); - DA da = ltl2da.convertLTLFormulaToDA(ltl, mc.getConstantValues(), allowedAcceptance); + if (Expression.isHOA(expr)) { + LTL2DA ltl2da = new LTL2DA(this); + time = System.currentTimeMillis(); + mainLog.println("Parsing and constructing HOA automaton for "+expr); + PrismPaths paths = new PrismPaths(mc.getModulesFile(), + mc.getPropertiesFile()); + Vector apExpressions = new Vector(); + da = ltl2da.fromExpressionHOA(expr, paths, apExpressions, allowedAcceptance); + + mainLog.println("Determining states satisfying atomic proposition labels of the automaton..."); + for (int i=0; i labelDDs = new Vector(); diff --git a/prism/src/prism/NondetModelChecker.java b/prism/src/prism/NondetModelChecker.java index 382128d9..e21f1429 100644 --- a/prism/src/prism/NondetModelChecker.java +++ b/prism/src/prism/NondetModelChecker.java @@ -1517,6 +1517,10 @@ public class NondetModelChecker extends NonProbModelChecker throw new PrismException("Model checking for \"dfa\" specifications not supported yet"); } + if (Expression.isHOA(expr)) { + throw new PrismNotSupportedException("Co-safety rewards with HOA automata not supported yet"); + } + // For LTL model checking routines mcLtl = new LTLModelChecker(prism); diff --git a/prism/src/prism/ProbModelChecker.java b/prism/src/prism/ProbModelChecker.java index 3622c015..e8f1312b 100644 --- a/prism/src/prism/ProbModelChecker.java +++ b/prism/src/prism/ProbModelChecker.java @@ -988,6 +988,10 @@ public class ProbModelChecker extends NonProbModelChecker throw new PrismException("Model checking for \"dfa\" specifications not supported yet"); } + if (Expression.isHOA(expr)) { + throw new PrismNotSupportedException("Co-safety rewards with HOA automata not supported yet"); + } + // For LTL model checking routines mcLtl = new LTLModelChecker(prism);