/// <summary> /// Get an element from the set. /// </summary> /// <returns>An element if non-empty.</returns> public T Element() { var model = this.Solver.Satisfiable(this.Set); if (!model.HasValue) { throw new ZenException("No element exists in state set."); } var assignment = new Dictionary <object, object>(); foreach (var kv in this.ArbitraryMapping) { var value = this.Solver.Get(model.Value, kv.Value); assignment[kv.Key] = value; } var interpreterEnv = new ExpressionEvaluatorEnvironment(assignment); return(CommonUtilities.ConvertSymbolicResultToCSharp <T>(this.ZenExpression.Accept(new ExpressionEvaluator(false), interpreterEnv))); }
/// <summary> /// Get an element from the set. /// </summary> /// <returns>An element if non-empty.</returns> public Option <T> Element() { var model = this.Solver.Satisfiable(this.Set); if (!model.HasValue) { return(Option.None <T>()); } var assignment = new Dictionary <object, object>(); foreach (var kv in this.ArbitraryMapping) { var value = this.Solver.Get(model.Value, kv.Value); assignment[kv.Key] = value; } var interpreterEnv = new ExpressionEvaluatorEnvironment(assignment); var result = CommonUtilities.ConvertSymbolicResultToCSharp <T>(this.ZenExpression.Accept(new ExpressionEvaluator(false), interpreterEnv)); return(Option.Some(result)); }
/// <summary> /// Generate inputs that exercise different program paths. /// </summary> /// <param name="function">The function.</param> /// <param name="precondition">A precondition.</param> /// <param name="input">The symbolic input.</param> /// <param name="backend">The backend to use.</param> /// <returns>A collection of inputs.</returns> public static IEnumerable <T1> GenerateInputs <T1, T2>( Func <Zen <T1>, Zen <T2> > function, Func <Zen <T1>, Zen <bool> > precondition, Zen <T1> input, Backend backend) { var expression = function(input).Simplify(); var assume = precondition(input).Simplify(); (T2, PathConstraint) interpretFunction(T1 e) { var assignment = ModelCheckerFactory.CreateModelChecker(backend, null).ModelCheck(input == e); var evaluator = new ExpressionEvaluator(true); var env = new ExpressionEvaluatorEnvironment(assignment); return((T2)expression.Accept(evaluator, env), evaluator.PathConstraint); } Option <T1> findFunction(Zen <bool> e) => SymbolicEvaluator.Find(e, input, backend); return(GenerateInputsSage(assume, findFunction, interpretFunction)); }