public TertiaryOpExpression(BooleanFunction f, BooleanExpression first, BooleanExpression second, BooleanExpression third) { F = f; First = first; Second = second; Third = third; }
public static bool CheckMonotony(BooleanFunction f, bool verbose = false) { for (int i = 0; i < 8; i++) { for (int j = 0; j < 8; j++) { if (!AreAdjacent(i, j) || !IsLessThan(i, j)) { continue; } if (f.EvalAt(i) > f.EvalAt(j)) { if (verbose) { Console.WriteLine("F ∉ T_<=, т.к. F({0}) > F({1})", PointAsString(i), PointAsString(j)); } return(false); } } } if (verbose) { Console.WriteLine("F ∈ T_<=, т.к. я на всех наборах проверял, честно!"); } return(true); }
public BooleanFunction DirectionalDeriv(params BooleanVariable[] variables) { Dictionary <BooleanVariable, bool> values; int res = 0; for (int i = 0; i < 8; i++) { res *= 2; values = new Dictionary <BooleanVariable, bool> { { BooleanVariable.A, i / 4 == 1 }, { BooleanVariable.B, i / 2 % 2 == 1 }, { BooleanVariable.C, i % 2 == 1 }, }; BooleanFunction leftOp = this; BooleanFunction rightOp = this; foreach (var variable in variables) { leftOp = leftOp.FixVar(variable, values[variable] ? 1 : 0); rightOp = rightOp.FixVar(variable, values[variable] ? 0 : 1); } res += leftOp.EvalAt(i) ^ rightOp.EvalAt(i); } return(new BooleanFunction((byte)res)); }
public static void PrintMaclauren0EqOr(int n) { BooleanFunction f = new BooleanFunction((byte)n); Console.WriteLine("F(A,B,C) = " + f.GetTailorStringEq(7)); Console.WriteLine(); }
static void PrintJustTruthTable(BooleanFunction f) { Console.WriteLine((new BooleanFunction(0x0F)).ToString("A")); Console.WriteLine((new BooleanFunction(0x33)).ToString("B")); Console.WriteLine((new BooleanFunction(0x55)).ToString("C")); Console.WriteLine(f.ToString("F")); }
public static void PrintExpressionFor3DirDerivative(int n) { BooleanFunction f = new BooleanFunction((byte)n); Console.WriteLine(DirDerivStrings[6] + " = " + BooleanExpression.FindMininalExpressionInBasis( f.DirectionalDeriv(VarLists[6]).Eval(), AvdoshinBases[0], AvdoshinVars[0]).ToString()); Console.WriteLine(); }
public static void Print3DirectionalDerivative(int n) { BooleanFunction f = new BooleanFunction((byte)n); PrintJustTruthTable(f); Console.WriteLine(f.DirectionalDeriv(VarLists[6]).ToString(DirDerivStrings[6])); Console.WriteLine(); }
public BooleanFunction Deriv(params BooleanVariable[] variables) { BooleanFunction res = this; foreach (var variable in variables) { res = new BooleanFunction((byte)(res.FixVar(variable, 0).Eval() ^ res.FixVar(variable, 1).Eval())); } return(res); }
public static void PrintTailor0EqOr(int n) { BooleanFunction f = new BooleanFunction((byte)n); for (int i = 0; i < 8; i++) { Console.WriteLine(ReprStrings[i] + ": F(A,B,C) = " + f.GetTailorStringEq(i)); } Console.WriteLine(); }
public static void PrintExpressionsFor2DirDerivatives(int n) { BooleanFunction f = new BooleanFunction((byte)n); for (int i = 3; i <= 5; i++) { Console.WriteLine(DirDerivStrings[i] + " = " + BooleanExpression.FindMininalExpressionInBasis( f.DirectionalDeriv(VarLists[i]).Eval(), AvdoshinBases[0], AvdoshinVars[0]).ToString()); } Console.WriteLine(); }
public static void Print2DirectionalDerivatives(int n) { BooleanFunction f = new BooleanFunction((byte)n); PrintJustTruthTable(f); for (int i = 3; i <= 5; i++) { Console.WriteLine(f.DirectionalDeriv(VarLists[i]).ToString(DirDerivStrings[i])); } Console.WriteLine(); }
public static void PrintClosedClasses(int n) { BooleanFunction f = new BooleanFunction((byte)n); PostClosedClasses.CheckConservationZero(f, true); PostClosedClasses.CheckConservationOne(f, true); PostClosedClasses.CheckSelfDuality(f, true); PostClosedClasses.CheckMonotony(f, true); PostClosedClasses.CheckLinearity(f, true); Console.WriteLine(); }
static public IEnumerable <TertiaryOpExpression> CombineTertiary(BooleanFunction f, BooleanExpression firstExpression, BooleanExpression anotherExpression, BooleanExpression thirdExpression) { yield return(new TertiaryOpExpression(f, firstExpression.Clone(), anotherExpression.Clone(), thirdExpression.Clone())); yield return(new TertiaryOpExpression(f, firstExpression.Clone(), thirdExpression.Clone(), anotherExpression.Clone())); yield return(new TertiaryOpExpression(f, anotherExpression.Clone(), firstExpression.Clone(), thirdExpression.Clone())); yield return(new TertiaryOpExpression(f, thirdExpression.Clone(), firstExpression.Clone(), anotherExpression.Clone())); yield return(new TertiaryOpExpression(f, anotherExpression.Clone(), thirdExpression.Clone(), firstExpression.Clone())); yield return(new TertiaryOpExpression(f, thirdExpression.Clone(), anotherExpression.Clone(), firstExpression.Clone())); }
public static bool CheckConservationZero(BooleanFunction f, bool verbose = false) { if (f.EvalAt(0) == 0) { if (verbose) { Console.WriteLine("F ∈ T_0, т.к. F(0,0,0) = 0"); } return(true); } else { if (verbose) { Console.WriteLine("F ∉ T_0, т.к. F(0,0,0) = 1"); } return(false); } }
public static bool CheckConservationOne(BooleanFunction f, bool verbose = false) { if (f.EvalAt(7) == 1) { if (verbose) { Console.WriteLine("F ∈ T_1, т.к. F(1,1,1) = 1"); } return(true); } else { if (verbose) { Console.WriteLine("F ∉ T_1, т.к. F(1,1,1) = 0"); } return(false); } }
public static bool CheckSelfDuality(BooleanFunction f, bool verbose = false) { for (int i = 0; i < 8; i++) { if (f.EvalAt(i) == f.EvalAt(7 - i)) { if (verbose) { Console.WriteLine("F ∉ T_*, т.к. F({0}) = F({1}) = {2}", PointAsString(i), PointAsString(7 - i), f.EvalAt(i)); } return(false); } } if (verbose) { Console.WriteLine("F ∈ T_*, т.к. я на всех наборах проверял, честно!"); } return(true); }
public static bool CheckLinearity(BooleanFunction f, bool verbose = false) { string zhegalkinRep = f.GetTailorStringXor(0); foreach (string s in new string[] { "AB", "BC", "AC", "ABC", }) { if (zhegalkinRep.Contains(s)) { if (verbose) { Console.WriteLine("F ∉ T_L, т.к. F(A,B,C) = " + zhegalkinRep); } return(false); } } if (verbose) { Console.WriteLine("F ∈ T_L, т.к. F(A,B,C) = " + zhegalkinRep); } return(true); }
public static bool CheckConservationOne(BooleanFunction f, bool verbose = false) { if(f.EvalAt(7) == 1) { if(verbose) Console.WriteLine("F ∈ T_1, т.к. F(1,1,1) = 1"); return true; } else { if(verbose) Console.WriteLine("F ∉ T_1, т.к. F(1,1,1) = 0"); return false; } }
public BooleanFunction Deriv(params BooleanVariable[] variables) { BooleanFunction res = this; foreach(var variable in variables) { res = new BooleanFunction((byte)(res.FixVar(variable, 0).Eval() ^ res.FixVar(variable, 1).Eval())); } return res; }
public static BooleanExpression FindMininalExpressionForBinary(BooleanExpression targetBinary, BooleanFunction f, List <BooleanExpression> availableExpressions) { var queue = new ImprovisedPriorityQueue <BooleanExpression>(20); var knownTruthTables = new HashSet <byte>(); var knownExpressions = new HashSet <BooleanExpression>(); foreach (var expression in availableExpressions) { queue.TryEnqueue(expression, 1); } while (queue.Count != 0) { var curExperession = queue.Dequeue(); byte truthTable = curExperession.Eval(); if (knownTruthTables.Contains(truthTable)) { continue; } if ((curExperession.Eval() & 0xAA) == (targetBinary.Eval() & 0xAA)) { return(curExperession); } knownExpressions.Add(curExperession); knownTruthTables.Add(truthTable); foreach (var anotherExpression in knownExpressions) { foreach (var thirdExpression in knownExpressions) { foreach (var neighbourExpression in CombineTertiary(f, curExperession, anotherExpression, thirdExpression)) { queue.TryEnqueue(neighbourExpression, neighbourExpression.CountOps()); } } } } throw new CouldntFindExpressionException(); }
public static bool[] GetFunctionClasses(BooleanFunction f) { return(new bool[] { CheckConservationZero(f), CheckConservationOne(f), CheckSelfDuality(f), CheckMonotony(f), CheckLinearity(f), }); }
public static IEnumerable<TertiaryOpExpression> CombineTertiary(BooleanFunction f, BooleanExpression firstExpression, BooleanExpression anotherExpression, BooleanExpression thirdExpression) { yield return new TertiaryOpExpression(f, firstExpression.Clone(), anotherExpression.Clone(), thirdExpression.Clone()); yield return new TertiaryOpExpression(f, firstExpression.Clone(), thirdExpression.Clone(), anotherExpression.Clone()); yield return new TertiaryOpExpression(f, anotherExpression.Clone(), firstExpression.Clone(), thirdExpression.Clone()); yield return new TertiaryOpExpression(f, thirdExpression.Clone(), firstExpression.Clone(), anotherExpression.Clone()); yield return new TertiaryOpExpression(f, anotherExpression.Clone(), thirdExpression.Clone(), firstExpression.Clone()); yield return new TertiaryOpExpression(f, thirdExpression.Clone(), anotherExpression.Clone(), firstExpression.Clone()); }
public static bool CheckConservationZero(BooleanFunction f, bool verbose = false) { if(f.EvalAt(0) == 0) { if(verbose) Console.WriteLine("F ∈ T_0, т.к. F(0,0,0) = 0"); return true; } else { if(verbose) Console.WriteLine("F ∉ T_0, т.к. F(0,0,0) = 1"); return false; } }
public static bool CheckMonotony(BooleanFunction f, bool verbose = false) { for(int i = 0; i < 8; i++) { for(int j = 0; j < 8; j++) { if(!AreAdjacent(i, j) || !IsLessThan(i, j)) continue; if(f.EvalAt(i) > f.EvalAt(j)) { if(verbose) Console.WriteLine("F ∉ T_<=, т.к. F({0}) > F({1})", PointAsString(i), PointAsString(j)); return false; } } } if(verbose) Console.WriteLine("F ∈ T_<=, т.к. я на всех наборах проверял, честно!"); return true; }
public static bool CheckLinearity(BooleanFunction f, bool verbose = false) { string zhegalkinRep = f.GetTailorStringXor(0); foreach(string s in new string[] { "AB", "BC", "AC", "ABC", }) { if(zhegalkinRep.Contains(s)) { if(verbose) Console.WriteLine("F ∉ T_L, т.к. F(A,B,C) = " + zhegalkinRep); return false; } } if(verbose) Console.WriteLine("F ∈ T_L, т.к. F(A,B,C) = " + zhegalkinRep); return true; }
public static void PrintTailor1XorAnd(int n) { BooleanFunction f = new BooleanFunction((byte)n); for(int i = 0; i < 8; i++) { Console.WriteLine(ReprStrings[i] + ": F(A,B,C) = " + f.GetTailorStringXor(i)); } Console.WriteLine(); }
public static void PrintDerivatives(int n) { BooleanFunction f = new BooleanFunction((byte)n); PrintJustTruthTable(f); for(int i = 0; i < 7; i++) { Console.WriteLine(f.Deriv(VarLists[i]).ToString(DerivStrings[i])); } Console.WriteLine(); }
public static BooleanExpression FindMininalExpressionForBinary(BooleanExpression targetBinary, BooleanFunction f, List<BooleanExpression> availableExpressions) { var queue = new ImprovisedPriorityQueue<BooleanExpression>(20); var knownTruthTables = new HashSet<byte>(); var knownExpressions = new HashSet<BooleanExpression>(); foreach(var expression in availableExpressions) { queue.TryEnqueue(expression, 1); } while(queue.Count != 0) { var curExperession = queue.Dequeue(); byte truthTable = curExperession.Eval(); if(knownTruthTables.Contains(truthTable)) { continue; } if((curExperession.Eval() & 0xAA) == (targetBinary.Eval() & 0xAA)) { return curExperession; } knownExpressions.Add(curExperession); knownTruthTables.Add(truthTable); foreach(var anotherExpression in knownExpressions) { foreach(var thirdExpression in knownExpressions) { foreach(var neighbourExpression in CombineTertiary(f, curExperession, anotherExpression, thirdExpression)) { queue.TryEnqueue(neighbourExpression, neighbourExpression.CountOps()); } } } } throw new CouldntFindExpressionException(); }
public static void PrintExpressionsForDerivatives(int n) { BooleanFunction f = new BooleanFunction((byte)n); for(int i = 0; i < 7; i++) { Console.WriteLine(DerivStrings[i] + " = " + BooleanExpression.FindMininalExpressionInBasis( f.Deriv(VarLists[i]).Eval(), AvdoshinBases[0], AvdoshinVars[0]).ToString()); } Console.WriteLine(); }
public static bool CheckSelfDuality(BooleanFunction f, bool verbose = false) { for(int i = 0; i < 8; i++) { if(f.EvalAt(i) == f.EvalAt(7 - i)) { if(verbose) Console.WriteLine("F ∉ T_*, т.к. F({0}) = F({1}) = {2}", PointAsString(i), PointAsString(7 - i), f.EvalAt(i)); return false; } } if(verbose) Console.WriteLine("F ∈ T_*, т.к. я на всех наборах проверял, честно!"); return true; }
public static bool[] GetFunctionClasses(BooleanFunction f) { return new bool[] { CheckConservationZero(f), CheckConservationOne(f), CheckSelfDuality(f), CheckMonotony(f), CheckLinearity(f), }; }
public static void PrintMaclauren1XorAnd(int n) { BooleanFunction f = new BooleanFunction((byte)n); Console.WriteLine("F(A,B,C) = " + f.GetTailorStringXor(0)); Console.WriteLine(); }