public List <ExpressionInfo> GenerateOptionals(List <ExpressionInfo> predicates, int numOptionals, int minClause, int maxClause) { var optionals = new List <ExpressionInfo>(); for (var i = 0; i < numOptionals; ++i) { var clauses = minClause + Rand.Next(maxClause - minClause); var expressions = new List <ExpressionInfo>(); var used = new List <int>(); for (var j = 0; j < clauses; ++j) { int choice; do { choice = Rand.Next(predicates.Count); }while (used.Contains(choice)); var predicate = predicates[choice]; if (j == 0) { var optional = Expression.MakeExpression(ExpressionFunctions.Lookup(ExpressionType.Optional), predicate.Expression); if (Rand.NextDouble() < 0.25) { optional = Expression.NotExpression(optional); } expressions.Add(new ExpressionInfo(optional, predicate.Bindings)); } else { expressions.Add(predicate); } used.Add(choice); } var conjunction = Binary(ExpressionType.And, expressions, out var bindings); optionals.Add(new ExpressionInfo(conjunction, bindings)); } return(optionals); }
/// <summary> /// Initializes a new instance of the <see cref="Expression"/> class. /// Built-in expression constructor. /// </summary> /// <param name="type">Type of built-in expression from <see cref="ExpressionType"/>.</param> /// <param name="children">Child expressions.</param> public Expression(string type, params Expression[] children) { Evaluator = ExpressionFunctions.Lookup(type); Children = children; }