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; }
/// <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; }
/// <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> /// <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!"); ; } }
/// <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; }