Пример #1
0
        protected override IEnumerable <SyntaxTree> CreateOptimalSolutions()
        {
            IList <SyntaxTree> trees = new List <SyntaxTree>();

            var a        = new IntIdentifierExpression("a");
            var b        = new IntIdentifierExpression("b");
            var c        = new IntIdentifierExpression("c");
            var d        = new IntIdentifierExpression("d");
            var ret      = new IntIdentifierExpression("ret");
            var trueVal  = new BoolTrueExpression();
            var falseVal = new BoolFalseExpression();
            var one      = new IntLiteralExpression(1);
            var two      = new IntLiteralExpression(2);
            var three    = new IntLiteralExpression(3);
            var four     = new IntLiteralExpression(4);

            /**
             * Solution 1 (for 3 parameters):
             * if (a > b) {
             *   if (a > c) {
             *     ret = a;
             *   } else {
             *     ret = c;
             *   }
             * } else {
             *   if (b > c) {
             *     ret = b;
             *   } else {
             *     ret = c;
             *   }
             * }
             */

            if (ParameterCount == 3)
            {
                trees.Add(new SyntaxTree(new IfStatement()
                {
                    Children =
                    {
                        new BoolGreaterThanIntExpression()
                        {
                            Children =
                            {
                                a, b
                            }
                        },
                        new IfStatement()
                        {
                            Children =
                            {
                                new BoolGreaterThanIntExpression()
                                {
                                    Children =
                                    {
                                        a, c
                                    }
                                },
                                new IntAssignmentStatement()
                                {
                                    Children =
                                    {
                                        ret, a
                                    }
                                },
                                new IntAssignmentStatement()
                                {
                                    Children =
                                    {
                                        ret, c
                                    }
                                }
                            }
                        },
                        new IfStatement()
                        {
                            Children =
                            {
                                new BoolGreaterThanIntExpression()
                                {
                                    Children =
                                    {
                                        b, c
                                    }
                                },
                                new IntAssignmentStatement()
                                {
                                    Children =
                                    {
                                        ret, b
                                    }
                                },
                                new IntAssignmentStatement()
                                {
                                    Children =
                                    {
                                        ret, c
                                    }
                                }
                            }
                        }
                    }
                }));
            }

            /**
             * Solution 1 (for 4 parameters):
             * if (a > b) {
             *   if (a > c) {
             *     if (a > d) {
             *       ret = a;
             *     } else {
             *       ret = d;
             *     }
             *   } else {
             *     if (c > d) {
             *       ret = c;
             *     } else {
             *       ret = d;
             *     }
             *   }
             * } else {
             *   if (b > c) {
             *     if (b > d) {
             *       ret = b;
             *     } else {
             *       ret = d;
             *     }
             *   } else {
             *     if (c > d) {
             *       ret = c;
             *     } else {
             *       ret = d;
             *     }
             *   }
             * }
             */

            trees.Add(new SyntaxTree(new IfStatement()
            {
                Children =
                {
                    new BoolGreaterThanIntExpression()
                    {
                        Children =
                        {
                            a, b
                        }
                    },
                    new IfStatement()
                    {
                        Children =
                        {
                            new BoolGreaterThanIntExpression()
                            {
                                Children =
                                {
                                    a, c
                                }
                            },
                            new IfStatement()
                            {
                                Children =
                                {
                                    new BoolGreaterThanIntExpression()
                                    {
                                        Children =
                                        {
                                            a, d
                                        }
                                    },
                                    new IntAssignmentStatement()
                                    {
                                        Children =
                                        {
                                            ret, a
                                        }
                                    },
                                    new IntAssignmentStatement()
                                    {
                                        Children =
                                        {
                                            ret, d
                                        }
                                    }
                                }
                            },
                            new IfStatement()
                            {
                                Children =
                                {
                                    new BoolGreaterThanIntExpression()
                                    {
                                        Children =
                                        {
                                            c, d
                                        }
                                    },
                                    new IntAssignmentStatement()
                                    {
                                        Children =
                                        {
                                            ret, c
                                        }
                                    },
                                    new IntAssignmentStatement()
                                    {
                                        Children =
                                        {
                                            ret, d
                                        }
                                    }
                                }
                            },
                        }
                    },
                    new IfStatement()
                    {
                        Children =
                        {
                            new BoolGreaterThanIntExpression()
                            {
                                Children =
                                {
                                    b, c
                                }
                            },
                            new IfStatement()
                            {
                                Children =
                                {
                                    new BoolGreaterThanIntExpression()
                                    {
                                        Children =
                                        {
                                            b, d
                                        }
                                    },
                                    new IntAssignmentStatement()
                                    {
                                        Children =
                                        {
                                            ret, b
                                        }
                                    },
                                    new IntAssignmentStatement()
                                    {
                                        Children =
                                        {
                                            ret, d
                                        }
                                    }
                                }
                            },
                            new IfStatement()
                            {
                                Children =
                                {
                                    new BoolGreaterThanIntExpression()
                                    {
                                        Children =
                                        {
                                            c, d
                                        }
                                    },
                                    new IntAssignmentStatement()
                                    {
                                        Children =
                                        {
                                            ret, c
                                        }
                                    },
                                    new IntAssignmentStatement()
                                    {
                                        Children =
                                        {
                                            ret, d
                                        }
                                    }
                                }
                            },
                        }
                    }
                }
            }));

            return(trees);
        }
Пример #2
0
        protected override IEnumerable <SyntaxTree> CreateOptimalSolutions()
        {
            IList <SyntaxTree> trees = new List <SyntaxTree>();

            var a        = new IntIdentifierExpression("a");
            var b        = new IntIdentifierExpression("b");
            var c        = new IntIdentifierExpression("c");
            var d        = new IntIdentifierExpression("d");
            var ret      = new BoolIdentifierExpression("ret");
            var trueVal  = new BoolTrueExpression();
            var falseVal = new BoolFalseExpression();

            /**
             * Solution 1 (for 3 parameters):
             * if (a == b || a == c) {
             *   ret = true;
             * } else {
             *   ret = false;
             * }
             */

            if (ParameterCount == 3)
            {
                trees.Add(new SyntaxTree(new IfStatement()
                {
                    Children =
                    {
                        new BoolOrExpression()
                        {
                            Children =
                            {
                                new BoolEqualIntExpression()
                                {
                                    Children =
                                    {
                                        a, b
                                    }
                                },
                                new BoolEqualIntExpression()
                                {
                                    Children =
                                    {
                                        a, c
                                    }
                                }
                            }
                        },
                        new BoolAssignmentStatement()
                        {
                            Children =
                            {
                                ret, trueVal
                            }
                        },
                        new BoolAssignmentStatement()
                        {
                            Children =
                            {
                                ret, falseVal
                            }
                        }
                    }
                }));
            }
            else if (ParameterCount == 4)
            {
                trees.Add(new SyntaxTree(new IfStatement()
                {
                    Children =
                    {
                        new BoolOrExpression()
                        {
                            Children =
                            {
                                new BoolOrExpression()
                                {
                                    Children =
                                    {
                                        new BoolEqualIntExpression()
                                        {
                                            Children =
                                            {
                                                a, b
                                            }
                                        },
                                        new BoolEqualIntExpression()
                                        {
                                            Children =
                                            {
                                                a, c
                                            }
                                        }
                                    }
                                },
                                new BoolEqualIntExpression()
                                {
                                    Children =
                                    {
                                        a, d
                                    }
                                }
                            }
                        },
                        new BoolAssignmentStatement()
                        {
                            Children =
                            {
                                ret, trueVal
                            }
                        },
                        new BoolAssignmentStatement()
                        {
                            Children =
                            {
                                ret, falseVal
                            }
                        }
                    }
                }));
            }

            /**
             * Solution 2 (for 3 parameters):
             * if (a != b && a != c) {
             *   ret = false;
             * } else {
             *   ret = true;
             * }
             */
            if (ParameterCount == 3)
            {
                trees.Add(new SyntaxTree(new IfStatement()
                {
                    Children =
                    {
                        new BoolAndExpression()
                        {
                            Children =
                            {
                                new BoolNotEqualIntExpression()
                                {
                                    Children =
                                    {
                                        a, b
                                    }
                                },
                                new BoolNotEqualIntExpression()
                                {
                                    Children =
                                    {
                                        a, c
                                    }
                                }
                            }
                        },
                        new BoolAssignmentStatement()
                        {
                            Children =
                            {
                                ret, falseVal
                            }
                        },
                        new BoolAssignmentStatement()
                        {
                            Children =
                            {
                                ret, trueVal
                            }
                        }
                    }
                }));
            }
            else if (ParameterCount == 4)
            {
                trees.Add(new SyntaxTree(new IfStatement()
                {
                    Children =
                    {
                        new BoolAndExpression()
                        {
                            Children =
                            {
                                new BoolAndExpression()
                                {
                                    Children =
                                    {
                                        new BoolNotEqualIntExpression()
                                        {
                                            Children =
                                            {
                                                a, b
                                            }
                                        },
                                        new BoolNotEqualIntExpression()
                                        {
                                            Children =
                                            {
                                                a, c
                                            }
                                        }
                                    }
                                },
                                new BoolNotEqualIntExpression()
                                {
                                    Children =
                                    {
                                        a, d
                                    }
                                }
                            }
                        },
                        new BoolAssignmentStatement()
                        {
                            Children =
                            {
                                ret, falseVal
                            }
                        },
                        new BoolAssignmentStatement()
                        {
                            Children =
                            {
                                ret, trueVal
                            }
                        }
                    }
                }));
            }

            /**
             * Solution 3 (for 3 parameters):
             * ret = a == b || a == c;
             */
            if (ParameterCount == 3)
            {
                trees.Add(new SyntaxTree(new BoolAssignmentStatement()
                {
                    Children =
                    {
                        ret,
                        new BoolOrExpression()
                        {
                            Children =
                            {
                                new BoolEqualIntExpression()
                                {
                                    Children =
                                    {
                                        a, b
                                    }
                                },
                                new BoolEqualIntExpression()
                                {
                                    Children =
                                    {
                                        a, c
                                    }
                                }
                            }
                        }
                    }
                }));
            }
            else if (ParameterCount == 4)
            {
                trees.Add(new SyntaxTree(new BoolAssignmentStatement()
                {
                    Children =
                    {
                        ret,
                        new BoolOrExpression()
                        {
                            Children =
                            {
                                new BoolOrExpression()
                                {
                                    Children =
                                    {
                                        new BoolEqualIntExpression()
                                        {
                                            Children =
                                            {
                                                a, b
                                            }
                                        },
                                        new BoolEqualIntExpression()
                                        {
                                            Children =
                                            {
                                                a, c
                                            }
                                        }
                                    }
                                },
                                new BoolEqualIntExpression()
                                {
                                    Children =
                                    {
                                        a, d
                                    }
                                }
                            }
                        }
                    }
                }));
            }

            return(trees);
        }
Пример #3
0
        protected override IEnumerable <SyntaxTree> CreateOptimalSolutions()
        {
            IList <SyntaxTree> trees = new List <SyntaxTree>();

            var a        = new IntIdentifierExpression("a");
            var b        = new IntIdentifierExpression("b");
            var c        = new IntIdentifierExpression("c");
            var d        = new IntIdentifierExpression("d");
            var ret      = new BoolIdentifierExpression("ret");
            var trueVal  = new BoolTrueExpression();
            var falseVal = new BoolFalseExpression();
            var one      = new IntLiteralExpression(1);
            var two      = new IntLiteralExpression(2);
            var three    = new IntLiteralExpression(3);
            var four     = new IntLiteralExpression(4);

            /**
             * Solution 1 (for 3 parameters):
             * if (((a == 1 && b == 1) || (b == 1 && c == 1)) || (a == 1 && c == 1)) {
             *   ret = true;
             * } else {
             *   ret = false;
             * }
             */
            if (ParameterCount == 3)
            {
                trees.Add(new SyntaxTree(new IfStatement()
                {
                    Children =
                    {
                        new BoolOrExpression()
                        {
                            Children =
                            {
                                new BoolOrExpression()
                                {
                                    Children =
                                    {
                                        new BoolAndExpression()
                                        {
                                            Children =
                                            {
                                                new BoolEqualIntExpression()
                                                {
                                                    Children =
                                                    {
                                                        a, one
                                                    }
                                                },
                                                new BoolEqualIntExpression()
                                                {
                                                    Children =
                                                    {
                                                        b, one
                                                    }
                                                }
                                            }
                                        },
                                        new BoolAndExpression()
                                        {
                                            Children =
                                            {
                                                new BoolEqualIntExpression()
                                                {
                                                    Children =
                                                    {
                                                        b, one
                                                    }
                                                },
                                                new BoolEqualIntExpression()
                                                {
                                                    Children =
                                                    {
                                                        c, one
                                                    }
                                                }
                                            }
                                        }
                                    }
                                },
                                new BoolAndExpression()
                                {
                                    Children =
                                    {
                                        new BoolEqualIntExpression()
                                        {
                                            Children =
                                            {
                                                a, one
                                            }
                                        },
                                        new BoolEqualIntExpression()
                                        {
                                            Children =
                                            {
                                                c, one
                                            }
                                        }
                                    }
                                }
                            }
                        },
                        new BoolAssignmentStatement()
                        {
                            Children =
                            {
                                ret, trueVal
                            }
                        },
                        new BoolAssignmentStatement()
                        {
                            Children =
                            {
                                ret, falseVal
                            }
                        }
                    }
                }));
            }

            /**
             * Solution 1 (for 4 parameters):
             * if (((a == 1 && b == 1) && c == 1) || (a == 1 && b == 1) && d == 1)) ||
             *   ((a == 1 && c == 1) && d == 1) || (b == 1 && c == 1) && d == 1))) {
             *     ret = true;
             *  else {
             *    ret = false;
             *  }
             */
            if (ParameterCount == 4)
            {
                trees.Add(new SyntaxTree(new IfStatement()
                {
                    Children =
                    {
                        new BoolOrExpression()
                        {
                            Children =
                            {
                                new BoolOrExpression()
                                {
                                    Children =
                                    {
                                        new BoolAndExpression()
                                        {
                                            Children =
                                            {
                                                new BoolAndExpression()
                                                {
                                                    Children =
                                                    {
                                                        new BoolEqualIntExpression()
                                                        {
                                                            Children =
                                                            {
                                                                a, one
                                                            }
                                                        },
                                                        new BoolEqualIntExpression()
                                                        {
                                                            Children =
                                                            {
                                                                b, one
                                                            }
                                                        }
                                                    }
                                                },
                                                new BoolEqualIntExpression()
                                                {
                                                    Children =
                                                    {
                                                        c, one
                                                    }
                                                }
                                            }
                                        },
                                        new BoolAndExpression()
                                        {
                                            Children =
                                            {
                                                new BoolAndExpression()
                                                {
                                                    Children =
                                                    {
                                                        new BoolEqualIntExpression()
                                                        {
                                                            Children =
                                                            {
                                                                a, one
                                                            }
                                                        },
                                                        new BoolEqualIntExpression()
                                                        {
                                                            Children =
                                                            {
                                                                b, one
                                                            }
                                                        }
                                                    }
                                                },
                                                new BoolEqualIntExpression()
                                                {
                                                    Children =
                                                    {
                                                        d, one
                                                    }
                                                }
                                            }
                                        }
                                    }
                                },
                                new BoolOrExpression()
                                {
                                    Children =
                                    {
                                        new BoolAndExpression()
                                        {
                                            Children =
                                            {
                                                new BoolAndExpression()
                                                {
                                                    Children =
                                                    {
                                                        new BoolEqualIntExpression()
                                                        {
                                                            Children =
                                                            {
                                                                a, one
                                                            }
                                                        },
                                                        new BoolEqualIntExpression()
                                                        {
                                                            Children =
                                                            {
                                                                c, one
                                                            }
                                                        }
                                                    }
                                                },
                                                new BoolEqualIntExpression()
                                                {
                                                    Children =
                                                    {
                                                        d, one
                                                    }
                                                }
                                            }
                                        },
                                        new BoolAndExpression()
                                        {
                                            Children =
                                            {
                                                new BoolAndExpression()
                                                {
                                                    Children =
                                                    {
                                                        new BoolEqualIntExpression()
                                                        {
                                                            Children =
                                                            {
                                                                b, one
                                                            }
                                                        },
                                                        new BoolEqualIntExpression()
                                                        {
                                                            Children =
                                                            {
                                                                c, one
                                                            }
                                                        }
                                                    }
                                                },
                                                new BoolEqualIntExpression()
                                                {
                                                    Children =
                                                    {
                                                        d, one
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        },
                        new BoolAssignmentStatement()
                        {
                            Children =
                            {
                                ret, trueVal
                            }
                        },
                        new BoolAssignmentStatement()
                        {
                            Children =
                            {
                                ret, falseVal
                            }
                        }
                    }
                }));
            }

            /**
             * Solution 2 (for 3 parameters):
             * ret = (((a == 1 && b == 1) || (b == 1 && c == 1)) || (a == 1 && c == 1))
             */
            if (ParameterCount == 3)
            {
                trees.Add(new SyntaxTree(new BoolAssignmentStatement()
                {
                    Children =
                    {
                        ret,
                        new BoolOrExpression()
                        {
                            Children =
                            {
                                new BoolOrExpression()
                                {
                                    Children =
                                    {
                                        new BoolAndExpression()
                                        {
                                            Children =
                                            {
                                                new BoolEqualIntExpression()
                                                {
                                                    Children =
                                                    {
                                                        a, one
                                                    }
                                                },
                                                new BoolEqualIntExpression()
                                                {
                                                    Children =
                                                    {
                                                        b, one
                                                    }
                                                }
                                            }
                                        },
                                        new BoolAndExpression()
                                        {
                                            Children =
                                            {
                                                new BoolEqualIntExpression()
                                                {
                                                    Children =
                                                    {
                                                        b, one
                                                    }
                                                },
                                                new BoolEqualIntExpression()
                                                {
                                                    Children =
                                                    {
                                                        c, one
                                                    }
                                                }
                                            }
                                        }
                                    }
                                },
                                new BoolAndExpression()
                                {
                                    Children =
                                    {
                                        new BoolEqualIntExpression()
                                        {
                                            Children =
                                            {
                                                a, one
                                            }
                                        },
                                        new BoolEqualIntExpression()
                                        {
                                            Children =
                                            {
                                                c, one
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }));
            }

            /**
             * Solution 2 (for 4 parameters):
             * ret = (((a == 1 && b == 1) && c == 1) || (a == 1 && b == 1) && d == 1)) ||
             *   ((a == 1 && c == 1) && d == 1) || (b == 1 && c == 1) && d == 1)))
             */
            if (ParameterCount == 4)
            {
                trees.Add(new SyntaxTree(new BoolAssignmentStatement()
                {
                    Children =
                    {
                        ret,
                        new BoolOrExpression()
                        {
                            Children =
                            {
                                new BoolOrExpression()
                                {
                                    Children =
                                    {
                                        new BoolAndExpression()
                                        {
                                            Children =
                                            {
                                                new BoolAndExpression()
                                                {
                                                    Children =
                                                    {
                                                        new BoolEqualIntExpression()
                                                        {
                                                            Children =
                                                            {
                                                                a, one
                                                            }
                                                        },
                                                        new BoolEqualIntExpression()
                                                        {
                                                            Children =
                                                            {
                                                                b, one
                                                            }
                                                        }
                                                    }
                                                },
                                                new BoolEqualIntExpression()
                                                {
                                                    Children =
                                                    {
                                                        c, one
                                                    }
                                                }
                                            }
                                        },
                                        new BoolAndExpression()
                                        {
                                            Children =
                                            {
                                                new BoolAndExpression()
                                                {
                                                    Children =
                                                    {
                                                        new BoolEqualIntExpression()
                                                        {
                                                            Children =
                                                            {
                                                                a, one
                                                            }
                                                        },
                                                        new BoolEqualIntExpression()
                                                        {
                                                            Children =
                                                            {
                                                                b, one
                                                            }
                                                        }
                                                    }
                                                },
                                                new BoolEqualIntExpression()
                                                {
                                                    Children =
                                                    {
                                                        d, one
                                                    }
                                                }
                                            }
                                        }
                                    }
                                },
                                new BoolOrExpression()
                                {
                                    Children =
                                    {
                                        new BoolAndExpression()
                                        {
                                            Children =
                                            {
                                                new BoolAndExpression()
                                                {
                                                    Children =
                                                    {
                                                        new BoolEqualIntExpression()
                                                        {
                                                            Children =
                                                            {
                                                                a, one
                                                            }
                                                        },
                                                        new BoolEqualIntExpression()
                                                        {
                                                            Children =
                                                            {
                                                                c, one
                                                            }
                                                        }
                                                    }
                                                },
                                                new BoolEqualIntExpression()
                                                {
                                                    Children =
                                                    {
                                                        d, one
                                                    }
                                                }
                                            }
                                        },
                                        new BoolAndExpression()
                                        {
                                            Children =
                                            {
                                                new BoolAndExpression()
                                                {
                                                    Children =
                                                    {
                                                        new BoolEqualIntExpression()
                                                        {
                                                            Children =
                                                            {
                                                                b, one
                                                            }
                                                        },
                                                        new BoolEqualIntExpression()
                                                        {
                                                            Children =
                                                            {
                                                                c, one
                                                            }
                                                        }
                                                    }
                                                },
                                                new BoolEqualIntExpression()
                                                {
                                                    Children =
                                                    {
                                                        d, one
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }));
            }
            return(trees);
        }