public static object GetRandomBooleanFormula(int countVariables, int depthBound, int sizeBound)
        {
            BooleanFormula booleanFormula = BooleanFormula.RandomFormula(countVariables, sizeBound, depthBound);

            BooleanFunction booleanFunction = new BooleanFunction(1, 1);
            booleanFunction.SetNewBooleanFormula(booleanFormula);

            return  CheckLatex(booleanFormula.ToLaTeXString());
        }
        /// <summary>
        /// Совершенная КНФ для заданной функции.
        /// </summary>
        /// <param name="function">Булева функция</param>
        /// <returns>Совершенная КНФ булевой функции</returns>
        public static BooleanFormula PerfectCNF(BooleanFunction function)
        {
            List <BooleanVariable> variables = new List <BooleanVariable>();

            for (int i = 0; i < function.VariableCount; i++)
            {
                variables.Add(new BooleanVariable("x", i + 1));
            }
            return(PerfectCNF(function, variables));
        }
        /// <summary>
        /// Совершенная КНФ для булевой функции на заданном наборе переменных.
        /// </summary>
        /// <param name="function">Булева функция</param>
        /// <param name="variables">Набор переменных, определяющий порядок и имена переменных</param>
        /// <returns>Совершенная КНФ булевой функции</returns>
        public static BooleanFormula PerfectCNF(BooleanFunction function, List <BooleanVariable> variables)
        {
            if (function.VariableCount > variables.Count)
            {
                throw new Exception("Недостаточно переменных в списке!");
            }
            BooleanFormula result;
            //создать список элементарных конъюнкций
            List <BooleanFormula> disjunctions = new List <BooleanFormula>();
            int length = 1 << function.VariableCount;

            for (int index = 0; index < length; index++)
            {
                //если значение на наборе равно 1 создаем эл. конъюнкцию
                if (!function[index])
                {
                    //отдельно последняя переменная (инициализация)
                    if ((index & 1) == 0)
                    {
                        result = variables[variables.Count - 1].ShallowClone();
                    }
                    else
                    {
                        result = new UnaryOperation(variables[variables.Count - 1].ShallowClone());
                    }
                    //определяем какие переменные с отрицанием, какие - без
                    for (int j = 1; j < function.VariableCount; j++)
                    {
                        if (((index >> j) & 1) == 0)
                        {
                            //(variableCount - j)-ая переменная из списка variables входит без отрицания
                            result = new BinaryOperation(BooleanOperations.OR, variables[variables.Count - j - 1].ShallowClone(), result);
                        }
                        else//с отрицанием
                        {
                            result = new BinaryOperation(BooleanOperations.OR, new UnaryOperation(variables[variables.Count - j - 1].ShallowClone()), result);
                        }
                    }
                    disjunctions.Add(result);
                }
            }
            //если список пуст, добавить константу 1
            if (disjunctions.Count == 0)
            {
                disjunctions.Add(new BooleanConstant(true));
            }
            //соединить связкой AND
            result = disjunctions[disjunctions.Count - 1];
            for (int i = disjunctions.Count - 2; i >= 0; i--)
            {
                result = new BinaryOperation(BooleanOperations.AND, disjunctions[i], result);
            }
            return(result);
        }
        public static object GetRandomBooleanFormulaWithParams(int countVariables, int depthBound, int sizeBound, bool isByLatex)
        {
            BooleanFormula booleanFormula = BooleanFormula.RandomFormula(countVariables, sizeBound, depthBound);

            BooleanFunction booleanFunction = new BooleanFunction(1, 1);
            booleanFunction.SetNewBooleanFormula(booleanFormula);

            var data = new
            {
                result = isByLatex ? booleanFormula.ToLaTeXString() : CheckLatex(booleanFormula.ToLaTeXString()),

                isMonotone = booleanFunction.IsMonotone(),
                isBalanced = booleanFunction.IsBalanced(),
                isLinear = booleanFunction.IsLinear(),

                isSelfAdjoint = booleanFunction.IsSelfAdjoint(),// Самосопряженная
                isComplete = booleanFunction.IsComplete(),
                isBasis = booleanFunction.IsBasis()
            };

            return data;
        }
Esempio n. 5
0
 /// <summary>
 /// Совершенная КНФ для булевой функции на заданном наборе переменных.
 /// </summary>
 /// <param name="function">Булева функция</param>
 /// <param name="variables">Набор переменных, определяющий порядок и имена переменных</param>
 /// <returns>Совершенная КНФ булевой функции</returns>
 public static BooleanFormula PerfectCNF(BooleanFunction function, List<BooleanVariable> variables)
 {
     if (function.VariableCount > variables.Count)
         throw new Exception("Недостаточно переменных в списке!");
     BooleanFormula result;
     //создать список элементарных конъюнкций
     List<BooleanFormula> disjunctions = new List<BooleanFormula>();
     int length = 1 << function.VariableCount;
     for (int index = 0; index < length; index++)
         //если значение на наборе равно 1 создаем эл. конъюнкцию
         if (!function[index])
         {
             //отдельно последняя переменная (инициализация)
             if ((index & 1) == 0)
                 result = variables[variables.Count - 1].ShallowClone();
             else
                 result = new UnaryOperation(variables[variables.Count - 1].ShallowClone());
             //определяем какие переменные с отрицанием, какие - без
             for (int j = 1; j < function.VariableCount; j++)
                 if (((index >> j) & 1) == 0)
                     //(variableCount - j)-ая переменная из списка variables входит без отрицания
                     result = new BinaryOperation(BooleanOperations.OR, variables[variables.Count - j - 1].ShallowClone(), result);
                 else//с отрицанием
                     result = new BinaryOperation(BooleanOperations.OR, new UnaryOperation(variables[variables.Count - j - 1].ShallowClone()), result);
             disjunctions.Add(result);
         }
     //если список пуст, добавить константу 1
     if (disjunctions.Count == 0)
         disjunctions.Add(new BooleanConstant(true));
     //соединить связкой AND
     result = disjunctions[disjunctions.Count - 1];
     for (int i = disjunctions.Count - 2; i >= 0; i--)
         result = new BinaryOperation(BooleanOperations.AND, disjunctions[i], result);
     return result;
 }
Esempio n. 6
0
 /// <summary>
 /// Совершенная КНФ для заданной функции.
 /// </summary>
 /// <param name="function">Булева функция</param>
 /// <returns>Совершенная КНФ булевой функции</returns>
 public static BooleanFormula PerfectCNF(BooleanFunction function)
 {
     List<BooleanVariable> variables = new List<BooleanVariable>();
     for (int i = 0; i < function.VariableCount; i++)
         variables.Add(new BooleanVariable("x", i + 1));
     return PerfectCNF(function, variables);
 }
Esempio n. 7
0
 /// <summary>
 /// Построение полинома Жегалкина для булевой функции.
 /// </summary>
 /// <param name="function">Булева функция</param>
 /// <returns>Полином Жегалкина</returns>
 public static BooleanFormula ZhegalkinPolynomial(BooleanFunction function)
 {
     return ZhegalkinPolynomial(BooleanFunction.ZhegalkinVector(function));
 }
 /// <summary>
 /// Построение вектора коэффициентов полинома Жегалкина для булевой функции
 /// </summary>
 /// <param name="function">Входная булева функция</param>
 /// <returns>Булевский вектор коэффициентов полинома Жегалкина</returns>
 public static bool[] ZhegalkinVector(BooleanFunction function)
 {
     bool[] result = (bool[])function.vector.Clone();
     ZhegalkinVector(result, 0, result.Length);
     return(result);
 }
 /// <summary>
 /// Построение полинома Жегалкина по формуле.
 /// </summary>
 /// <param name="formula">Исходная формула</param>
 /// <returns>Полином Жегалкина</returns>
 public static BooleanFormula ZhegalkinPolynomial(BooleanFormula formula)
 {
     return(ZhegalkinPolynomial(BooleanFunction.ZhegalkinVector(formula.RealizedFunction), formula.Variables));
 }
 /// <summary>
 /// Построение полинома Жегалкина для булевой функции.
 /// </summary>
 /// <param name="function">Булева функция</param>
 /// <returns>Полином Жегалкина</returns>
 public static BooleanFormula ZhegalkinPolynomial(BooleanFunction function)
 {
     return(ZhegalkinPolynomial(BooleanFunction.ZhegalkinVector(function)));
 }
        // Генерируем и возвращаем изображение // Генерируется задача в зависимости от присланного номера
        public string CheckBooleanFormulaInput(string formula, int operation)
        {
            formula = formula.Replace("{", "(!(");
            formula = formula.Replace("}", "))");
            formula = formula.Trim();

            try
            {
                if (operation == 0)
                {

                    List<BooleanVariable> variables = new List<BooleanVariable>();
                    BooleanFormula booleanFormula = BooleanFormulaParser.Parse(formula, variables);

                    return booleanFormula.ToLaTeXString();
                } else if (operation == 1)
                {

                    List<BooleanVariable> variables = new List<BooleanVariable>();
                    BooleanFormula booleanFormula = BooleanFormulaParser.Parse(formula, variables);

                    return BooleanFormulaService.CheckLatex(booleanFormula.ToLaTeXString());
                } else if (operation == 2)
                {

                    List<BooleanVariable> variables = new List<BooleanVariable>();
                    BooleanFormula booleanFormula = BooleanFormulaParser.Parse(formula, variables);

                    return BooleanFormulaService.CheckLatex(booleanFormula.GetZhegalkinPolynomial().ToLaTeXString());
                }
                else if (operation == 3)
                {

                    List<BooleanVariable> variables = new List<BooleanVariable>();
                    BooleanFormula booleanFormula = BooleanFormulaParser.Parse(formula, variables);

                    return BooleanFormulaService.CheckLatex(BooleanFormula.PerfectCNF(booleanFormula).ToLaTeXString());
                }else if (operation == 4)
                {

                    List<BooleanVariable> variables = new List<BooleanVariable>();
                    BooleanFormula booleanFormula = BooleanFormulaParser.Parse(formula, variables);

                    return BooleanFormulaService.CheckLatex(BooleanFormula.PerfectDNF(booleanFormula).ToLaTeXString());
                }
                else if (operation == 5)
                {

                    List<BooleanVariable> variables = new List<BooleanVariable>();

                    BooleanFunction booleanFunction = new BooleanFunction(1,1);
                    booleanFunction.SetNewBooleanFormula(BooleanFormulaParser.Parse(formula, variables));

                    return BooleanFormulaService.CheckLatex(booleanFunction.ToLaTeXBooleanTable());
                }
                else
                {
                    return BooleanFormulaService.CheckLatex("Not_selected_operation");
                }
            }
            catch (Exception e)
            {
                return BooleanFormulaService.CheckLatex("Error_in_formule!"); ;
            }
        }
Esempio n. 12
0
 /// <summary>
 /// Построение вектора коэффициентов полинома Жегалкина для булевой функции
 /// </summary>
 /// <param name="function">Входная булева функция</param>
 /// <returns>Булевский вектор коэффициентов полинома Жегалкина</returns>
 public static bool[] ZhegalkinVector(BooleanFunction function)
 {
     bool[] result = (bool[])function.vector.Clone();
     ZhegalkinVector(result, 0, result.Length);
     return result;
 }