@@ -0,0 +1,190 @@
3+namespace SolveAvdoshin
5+ public static class BooleanFunctions
7+ public static void Main()
9+ var ex = new OpSubexpression(BooleanOperation.Imp, new NotSubexpression(BooleanVariable.A), new OpSubexpression(BooleanOperation.Xor, BooleanVariable.B, BooleanVariable.C));
11+ Console.WriteLine(ex.ToString());
12+ Console.WriteLine(ex.Eval(false, true, true));
16+ enum BooleanOperation { Zero, NOR, NotBImp, NotA, NotImp, NotB, Xor, NAND, And, Eq, B, Imp, A, BImp, Or, One };
17+ enum BooleanVariable { A, B, C };
19+ abstract class BooleanExpression // TODO: Make private
24+ abstract class BooleanSubexpression
26+ abstract public bool Eval(bool a, bool b, bool c);
27+ abstract new public string ToString();
30+ class NotSubexpression : BooleanSubexpression
32+ BooleanSubexpression Arg;
34+ public NotSubexpression(BooleanSubexpression arg)
39+ public NotSubexpression(BooleanVariable variable)
41+ Arg = new VarSubexpression(variable);
44+ public override string ToString()
46+ return "!" + Arg.ToString();
49+ public override bool Eval(bool a, bool b, bool c)
51+ return !Arg.Eval(a, b, c);
55+ class OpSubexpression : BooleanSubexpression
57+ static readonly string[] OpSymbols = new string[] { "(Zero)", "(NOR)", "</=", "(NotA)", "=/>", "(NotB)", "⨁", "(NAND)", "&", "==", "(B)", "=>", "(A)", "<=", "|", "(One)", };
60+ BooleanSubexpression Left, Right;
62+ public OpSubexpression(BooleanOperation op, BooleanSubexpression left, BooleanSubexpression right)
69+ public OpSubexpression(BooleanOperation op, BooleanVariable left, BooleanSubexpression right)
72+ Left = new VarSubexpression(left);
76+ public OpSubexpression(BooleanOperation op, BooleanSubexpression left, BooleanVariable right)
80+ Right = new VarSubexpression(right);
83+ public OpSubexpression(BooleanOperation op, BooleanVariable left, BooleanVariable right)
86+ Left = new VarSubexpression(left);
87+ Right = new VarSubexpression(right);
90+ public override bool Eval(bool a, bool b, bool c)
92+ bool aVal = Left.Eval(a, b, c);
93+ bool bVal = Right.Eval(a, b, c);
96+ case BooleanOperation.Zero:
98+ case BooleanOperation.NOR:
99+ return !(aVal || bVal);
100+ case BooleanOperation.NotBImp:
101+ return !aVal && bVal;
102+ case BooleanOperation.NotA:
104+ case BooleanOperation.NotImp:
105+ return aVal && !bVal;
106+ case BooleanOperation.NotB:
108+ case BooleanOperation.Xor:
109+ return aVal != bVal;
110+ case BooleanOperation.NAND:
111+ return !(aVal && bVal);
112+ case BooleanOperation.And:
113+ return aVal && bVal;
114+ case BooleanOperation.Eq:
115+ return aVal == bVal;
116+ case BooleanOperation.B:
118+ case BooleanOperation.Imp:
119+ return !aVal || bVal;
120+ case BooleanOperation.A:
122+ case BooleanOperation.BImp:
123+ return aVal || !bVal;
124+ case BooleanOperation.Or:
125+ return aVal || bVal;
126+ case BooleanOperation.One:
129+ throw new ArgumentException();
133+ public override string ToString()
135+ return "(" + Left.ToString() + " " + OpSymbols[(int)Op] + " " + Right.ToString() + ")";
139+ class VarSubexpression : BooleanSubexpression
141+ static readonly string[] VarSymbols = new string[] { "A", "B", "C", };
143+ BooleanVariable Var;
145+ public VarSubexpression(BooleanVariable var)
150+ public override bool Eval(bool a, bool b, bool c)
153+ case BooleanVariable.A:
155+ case BooleanVariable.B:
157+ case BooleanVariable.C:
160+ throw new Exception("Nigga wat?");
164+ public override string ToString()
166+ return VarSymbols[(int)Var];
170+ class BooleanFunction // TODO: Make private ?
174+ public BooleanFunction(int n)
179+ public int Eval(int a, int b, int c)
181+ return TruthTable >> (7 - 4 * a - 2 * b - c) & 1;
184+ public BooleanExpression GetFDNF() // СДНФ