示例#1
0
        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);
            }
        }
示例#2
0
        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());
                }
            }
        }
示例#3
0
        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);
            }
        }
示例#4
0
        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());
                }
            }
        }