/// <summary> /// Model check an expression to find inputs that lead to it being false. /// </summary> /// <param name="expression">The expression.</param> /// <returns> /// Assignment to zen arbitrary variables that make the expression false. /// Null if no such assignment exists. /// </returns> public Dictionary <object, object> ModelCheck(Zen <bool> expression) { var symbolicEvaluator = new SymbolicEvaluationVisitor <TModel, TVar, TBool, TInt>(solver); var env = new SymbolicEvaluationEnvironment <TModel, TVar, TBool, TInt>(); var symbolicResult = (SymbolicBool <TModel, TVar, TBool, TInt>)expression.Accept(symbolicEvaluator, env); // Console.WriteLine($"[time] model checking: {watch.ElapsedMilliseconds}ms"); // watch.Restart(); var possibleModel = solver.Satisfiable(symbolicResult.Value); // Console.WriteLine($"[time] get sat: {watch.ElapsedMilliseconds}ms"); if (!possibleModel.HasValue) { return(null); } var model = possibleModel.Value; // compute the input given the assignment var arbitraryAssignment = new Dictionary <object, object>(); foreach (var kv in symbolicEvaluator.ArbitraryVariables) { var expr = kv.Key; var variable = kv.Value; arbitraryAssignment.Add(expr, this.solver.Get(model, variable)); } return(arbitraryAssignment); }
/// <summary> /// Model check an expression to find inputs that lead to it being false. /// </summary> /// <param name="expression">The expression.</param> /// <returns> /// Assignment to zen arbitrary variables that make the expression false. /// Null if no such assignment exists. /// </returns> public Dictionary <object, object> ModelCheck(Zen <bool> expression) { var symbolicEvaluator = new SymbolicEvaluationVisitor <TModel, TVar, TBool, TBitvec, TInt, TString>(solver); var env = new SymbolicEvaluationEnvironment <TModel, TVar, TBool, TBitvec, TInt, TString>(); var symbolicResult = (SymbolicBool <TModel, TVar, TBool, TBitvec, TInt, TString>)expression.Accept(symbolicEvaluator, env); var possibleModel = solver.Satisfiable(symbolicResult.Value); if (!possibleModel.HasValue) { return(null); } var model = possibleModel.Value; // compute the input given the assignment var arbitraryAssignment = new Dictionary <object, object>(); foreach (var kv in symbolicEvaluator.ArbitraryVariables) { var expr = kv.Key; var variable = kv.Value; var type = expr.GetType().GetGenericArguments()[0]; var obj = this.solver.Get(model, variable); if (ReflectionUtilities.IsFixedIntegerType(type)) { obj = type.GetConstructor(new Type[] { typeof(byte[]) }).Invoke(new object[] { obj }); } arbitraryAssignment.Add(expr, obj); } return(arbitraryAssignment); }