public ExampleSpec WitnessFlipComparisonSymbol(GrammarRule rule, ExampleSpec spec)
        {
            var examples = new Dictionary <State, object>();

            foreach (var input in spec.ProvidedInputs)
            {
                var before = (Node)input[rule.Body[0]];
                var after  = (Node)spec.Examples[input];

                var flippable = new List <string>()
                {
                    "<",
                    ">",
                    "<=",
                    ">="
                };

                foreach (var symbol in flippable)
                {
                    if (Semantics.FlipComparison(before, symbol, true).IsEqualTo(after))
                    {
                        examples[input] = symbol;
                    }
                }
            }

            return(new ExampleSpec(examples));
        }
        public DisjunctiveExamplesSpec WitnessFilterByProcessProcess(GrammarRule rule, ExampleSpec spec)
        {
            var examples = new Dictionary <State, IEnumerable <object> >();

            foreach (var input in spec.ProvidedInputs)
            {
                var before   = (Node)input[rule.Body[0]];
                var after    = (List <int>)spec.Examples[input];
                var children = before.GetProcesses();
                foreach (var child in children)
                {
                    if (Semantics.FilterByProcess(before, child).OrderBy(i => i)
                        .SequenceEqual(after.OrderBy(i => i)))
                    {
                        if (!examples.ContainsKey(input))
                        {
                            examples[input] = new List <string>();
                        }
                        ((List <string>)examples[input]).Add(child);
                    }
                }
            }

            return(new DisjunctiveExamplesSpec(examples));
        }
        public ExampleSpec WitnessIndexFromBackIndex(GrammarRule rule, ExampleSpec spec)
        {
            var examples = new Dictionary <State, object>();

            foreach (var input in spec.ProvidedInputs)
            {
                var before = (Node)input[rule.Body[0]];
                var after  = (int)spec.Examples[input];

                for (var i = 0; i < before.Children.Count; ++i)
                {
                    if (Semantics.IndexFromBack(before, i) == after)
                    {
                        examples[input] = i;
                    }
                }
            }

            return(new ExampleSpec(examples));
        }
        public ExampleSpec WitnessIndexByNameName(GrammarRule rule, ExampleSpec spec)
        {
            var examples = new Dictionary <State, object>();

            foreach (var input in spec.ProvidedInputs)
            {
                var before   = (Node)input[rule.Body[0]];
                var after    = (int)spec.Examples[input];
                var children = before.GetIdentifiers();

                foreach (var child in children)
                {
                    if (Semantics.IndexByName(before, child) == after)
                    {
                        examples[input] = child;
                    }
                }
            }

            return(new ExampleSpec(examples));
        }
        public DisjunctiveExamplesSpec WitnessMoveLeft(GrammarRule rule, ExampleSpec spec, ExampleSpec positionSpec)
        {
            var examples = new Dictionary <State, IEnumerable <object> >();

            foreach (var input in spec.Examples)
            {
                var inputState = input.Key;
                var before     = (Node)inputState[rule.Body[0]];
                var position   = (int)positionSpec.Examples[inputState];
                var after      = (Node)spec.Examples[inputState];
                if (Semantics.Move(before, position, true).IsEqualTo(after))
                {
                    if (!examples.ContainsKey(inputState))
                    {
                        examples[inputState] = new List <object>();
                    }

                    if (!(examples[inputState]).Contains(true))
                    {
                        ((List <object>)examples[inputState]).Add(true);
                    }
                }

                if (Semantics.Move(before, position, false).IsEqualTo(after))
                {
                    if (!examples.ContainsKey(inputState))
                    {
                        examples[inputState] = new List <object>();
                    }

                    if (!(examples[inputState]).Contains(false))
                    {
                        ((List <object>)examples[inputState]).Add(false);
                    }
                }
            }

            return(new DisjunctiveExamplesSpec(examples));
        }
        public DisjunctiveExamplesSpec WitnessFlipByProcessProcess(GrammarRule rule, ExampleSpec spec)
        {
            var examples = new Dictionary <State, IEnumerable <object> >();

            foreach (var input in spec.ProvidedInputs)
            {
                var before = (Node)input[rule.Body[0]];
                var after  = (bool)spec.Examples[input];

                var flippable = new List <string>()
                {
                    "<",
                    ">",
                    "<=",
                    ">="
                };

                var children = before.GetProcesses();

                foreach (var symbol in flippable)
                {
                    foreach (var child in children)
                    {
                        if (Semantics.FlipByProcess(before, child) == after)
                        {
                            if (!examples.ContainsKey(input))
                            {
                                examples[input] = new List <object>();
                            }

                            ((List <object>)examples[input]).Add(child);
                        }
                    }
                }
            }

            return(new DisjunctiveExamplesSpec(examples));
        }
        public ExampleSpec WitnessToImpLeftSide(GrammarRule rule, ExampleSpec spec)
        {
            var examples = new Dictionary <State, object>();

            foreach (var input in spec.ProvidedInputs)
            {
                var before        = (Node)input[rule.Body[0]];
                var after         = (Node)spec.Examples[input];
                var children      = before.Children;
                var numLeftSide   = after.Type == Z3_decl_kind.Z3_OP_AND ? after.Children.Count : after.Children[0].Type == Z3_decl_kind.Z3_OP_AND ? after.Children[0].Children.Count : 1;
                var listOfIndices = Enumerable.Range(0, children.Count);
                var possibleLists = Utils.GetKCombs(listOfIndices, numLeftSide);
                foreach (var sub in possibleLists)
                {
                    var subList = sub.ToList();
                    if (Semantics.ToImp(before, subList).IsEqualTo(after))
                    {
                        examples[input] = subList;
                    }
                }
            }
            return(new ExampleSpec(examples));
        }
        public ExampleSpec WitnessMovePosition(GrammarRule rule, ExampleSpec spec)
        {
            var examples = new Dictionary <State, object>();

            foreach (var input in spec.ProvidedInputs)
            {
                var before = (Node)input[rule.Body[0]];
                var after  = (Node)spec.Examples[input];
                for (var i = 0; i < after.Children.Count; ++i)
                {
                    if (Semantics.Move(before, i, true).IsEqualTo(after))
                    {
                        examples[input] = i;
                    }

                    if (Semantics.Move(before, i, false).IsEqualTo(after))
                    {
                        examples[input] = i;
                    }
                }
            }

            return(new ExampleSpec(examples));
        }
        public DisjunctiveExamplesSpec WitnessFilterStaticType(GrammarRule rule, ExampleSpec spec)
        {
            var examples = new Dictionary <State, IEnumerable <object> >();

            foreach (var input in spec.ProvidedInputs)
            {
                var before = (Node)input[rule.Body[0]];
                var after  = (List <int>)spec.Examples[input];
                foreach (StaticFilterType type in Enum.GetValues(typeof(StaticFilterType)))
                {
                    if (Semantics.FilterStatic(before, type).OrderBy(i => i)
                        .SequenceEqual(after.OrderBy(i => i)))
                    {
                        if (!examples.ContainsKey(input))
                        {
                            examples[input] = new List <object>();
                        }
                        ((List <object>)examples[input]).Add(type);
                    }
                }
            }

            return(new DisjunctiveExamplesSpec(examples));
        }