public new static IEnumerable <Solution> Search(Atomic atomic, bool verify = true) { Debug.WriteLine($"Resolving tactic {atomic.DynamicContext.tactic}"); //local solution list var result = atomic == null ? new List <Solution>() : new List <Solution> { new Solution(atomic) }; while (true) { var interm = new List <Solution>(); if (result.Count == 0) { yield break; } // iterate every solution foreach (var item in result) { // lazily resolve a statement in the solution foreach (var solution in Atomic.ResolveStatement(item)) { // validate result if (solution.IsResolved()) { if (verify) { if (!VerifySolution(solution)) { continue; } yield return(solution); yield break; } yield return(solution); } else if (solution.State.DynamicContext.isPartialyResolved) { if (verify) { if (VerifySolution(solution)) { yield return(solution); yield break; } interm.Add(solution); } else { interm.Add(solution); yield return(solution); } } else { interm.Add(solution); } } } result.Clear(); result.AddRange(interm); } }
public static IEnumerable <Solution> SearchBlockStmt(BlockStmt body, Atomic atomic) { Atomic ac = atomic.Copy(); ac.DynamicContext.tacticBody = body.Body; ac.DynamicContext.ResetCounter(); Stack <IEnumerator <Solution> > solutionStack = new Stack <IEnumerator <Solution> >(); solutionStack.Push(Atomic.ResolveStatement(new Solution(ac)).GetEnumerator()); while (true) { if (solutionStack.Count == 0) { yield break; } var solutionEnum = solutionStack.Pop(); // if the solution is fully resolved skip resolution if (!solutionEnum.MoveNext()) { continue; } var solution = solutionEnum.Current; solutionStack.Push(solutionEnum); if (solution.State.DynamicContext.isPartialyResolved) { solutionStack.Push(Atomic.ResolveStatement(solution).GetEnumerator()); yield return(solution); } else if (solution.State.DynamicContext.GetCurrentStatement() == null) { yield return(solution); } else { solutionStack.Push(Atomic.ResolveStatement(solution).GetEnumerator()); } } }
public static IEnumerable <Solution> SearchBlockStmt(BlockStmt body, Atomic atomic) { Atomic ac = atomic.Copy(); ac.DynamicContext.tacticBody = body.Body; ac.DynamicContext.ResetCounter(); List <Solution> result = new List <Solution> { new Solution(ac) }; // search strategy for body goes here while (true) { List <Solution> interm = new List <Solution>(); if (result.Count == 0) { break; } foreach (var solution in result) { foreach (var item in Atomic.ResolveStatement(solution)) { if (item.State.DynamicContext.isPartialyResolved) { { interm.Add(item); } yield return(item); } else if (item.State.DynamicContext.GetCurrentStatement() == null) { yield return(item); } else { interm.Add(item); } } } result.Clear(); result.AddRange(interm); } }
public new static IEnumerable <Solution> Search(Atomic atomic, bool verify = true) { Stack <IEnumerator <Solution> > solutionStack = new Stack <IEnumerator <Solution> >(); if (atomic != null) { solutionStack.Push(Atomic.ResolveStatement(new Solution(atomic)).GetEnumerator()); } while (true) { if (solutionStack.Count == 0) { yield break; } var solutionEnum = solutionStack.Pop(); // if the solution is fully resolved skip resolution if (!solutionEnum.MoveNext()) { continue; } var solution = solutionEnum.Current; solutionStack.Push(solutionEnum); if (solution.IsResolved()) { if (verify) { if (VerifySolution(solution)) { yield return(solution); yield break; } } else { yield return(solution); } } else if (solution.State.DynamicContext.isPartialyResolved) { if (verify) { if (VerifySolution(solution)) { yield return(solution); yield break; } solutionStack.Push(Atomic.ResolveStatement(solution).GetEnumerator()); } else { solutionStack.Push(Atomic.ResolveStatement(solution).GetEnumerator()); yield return(solution); } } else { solutionStack.Push(Atomic.ResolveStatement(solution).GetEnumerator()); } } }