git.iko.soy/ikoHSE/SolveAvdoshin
on master help sign in
Expression search in ex.15 is now based on previously found expressions
commitd07b0dce1b78b5ba68c2dc6a950ee347957099bc authorIlya Gulkov <isgulkov@edu.hse.ru> dateMon 12 Oct 2015, 16:02 (11 years ago) parent423df6b
1 file changed+25−15
SolveAvdoshin/BooleanFunctions.cs+25−15
SolveAvdoshin/BooleanFunctions.cs+25−15
@@ -302,29 +302,35 @@ namespace SolveAvdoshin
302302 Console.WriteLine();
303303 }
304304
305+ // Закомменченные функции не рассматриваются в силу избыточности
305306 static readonly Tuple<BooleanOperation, bool[]>[] BinariesAndClasses = {
307+ new Tuple<BooleanOperation, bool[]>(BooleanOperation.NotA, new bool[5] { false, false, true, false, true, }),
306308 new Tuple<BooleanOperation, bool[]>(BooleanOperation.Zero, new bool[5] { true, false, false, true, true, }),
309+ new Tuple<BooleanOperation, bool[]>(BooleanOperation.One, new bool[5] { false, true, false, true, true, }),
307310 new Tuple<BooleanOperation, bool[]>(BooleanOperation.And, new bool[5] { true, true, false, true, false, }),
308311 new Tuple<BooleanOperation, bool[]>(BooleanOperation.CoImp, new bool[5] { true, false, false, false, false, }),
309−// new Tuple<BooleanOperation, bool[]>(BooleanOperation.A, new bool[5] { false, false, false, false, false, } ),
310−// new Tuple<BooleanOperation, bool[]>(BooleanOperation.BCoImp, new bool[5] { false, false, false, false, false, } ),
311−// new Tuple<BooleanOperation, bool[]>(BooleanOperation.B, new bool[5] { false, false, false, false, false, } ),
312+// new Tuple<BooleanOperation, bool[]>(BooleanOperation.A, new bool[5] { ),
313+// new Tuple<BooleanOperation, bool[]>(BooleanOperation.BCoImp, new bool[5] { } ),
314+// new Tuple<BooleanOperation, bool[]>(BooleanOperation.B, new bool[5] { } ),
312315 new Tuple<BooleanOperation, bool[]>(BooleanOperation.Xor, new bool[5] { true, false, false, false, true, }),
313316 new Tuple<BooleanOperation, bool[]>(BooleanOperation.Or, new bool[5] { true, true, false, true, false, }),
314317 new Tuple<BooleanOperation, bool[]>(BooleanOperation.NOR, new bool[5] { false, false, false, false, false, }),
315318 new Tuple<BooleanOperation, bool[]>(BooleanOperation.Eq, new bool[5] { false, true, false, false, true, }),
316−// new Tuple<BooleanOperation, bool[]>(BooleanOperation.NotB, new bool[5] { false, false, false, false, false, } ),
317−// new Tuple<BooleanOperation, bool[]>(BooleanOperation.BImp, new bool[5] { false, false, false, false, false, } ),
318− new Tuple<BooleanOperation, bool[]>(BooleanOperation.NotA, new bool[5] { false, false, true, false, true, }),
319+// new Tuple<BooleanOperation, bool[]>(BooleanOperation.NotB, new bool[5] { } ),
320+// new Tuple<BooleanOperation, bool[]>(BooleanOperation.BImp, new bool[5] { } ),
319321 new Tuple<BooleanOperation, bool[]>(BooleanOperation.Imp, new bool[5] { false, true, false, false, false, }),
320322 new Tuple<BooleanOperation, bool[]>(BooleanOperation.NAND, new bool[5] { false, false, false, false, false, }),
321− new Tuple<BooleanOperation, bool[]>(BooleanOperation.One, new bool[5] { false, true, false, true, true, }),
322323 };
323324
324325 public static void PrintRepresentBinariesInF(int n)
325326 {
326327 bool[] functionClasses = PostClosedClasses.GetFunctionClasses(new BooleanFunction((byte)n));
327328
329+ var availableExpressions = new List<BooleanExpression> {
330+ new VarExpression(BooleanVariable.A),
331+ new VarExpression(BooleanVariable.B),
332+ };
333+
328334 foreach(var t in BinariesAndClasses) {
329335 bool representable = true;
330336
@@ -339,8 +345,13 @@ namespace SolveAvdoshin
339345 continue;
340346
341347 try {
342− Console.WriteLine((new OpExpression(t.Item1, BooleanVariable.A, BooleanVariable.B)).ToString() + " = " +
343− TertiaryOpExpression.FindMininalExpressionForBinary(t.Item1, new BooleanFunction((byte)n)));
348+ var targetExpression = new OpExpression(t.Item1, BooleanVariable.A, BooleanVariable.B);
349+
350+ Console.WriteLine(targetExpression.ToString() + " = " +
351+ TertiaryOpExpression.FindMininalExpressionForBinary(targetExpression,
352+ new BooleanFunction((byte)n), availableExpressions));
353+
354+ availableExpressions.Add(targetExpression);
344355 }
345356 catch(CouldntFindExpressionException) {
346357
@@ -421,16 +432,15 @@ namespace SolveAvdoshin
421432 firstExpression.Clone());
422433 }
423434
424− public static BooleanExpression FindMininalExpressionForBinary(BooleanOperation binary, BooleanFunction f)
435+ public static BooleanExpression FindMininalExpressionForBinary(BooleanExpression targetBinary, BooleanFunction f,
436+ List<BooleanExpression> availableExpressions)
425437 {
426438 var queue = new ImprovisedPriorityQueue<BooleanExpression>(20);
427439 var knownTruthTables = new HashSet<byte>();
428440 var knownExpressions = new HashSet<BooleanExpression>();
429441
430− var targetExpression = new OpExpression(binary, BooleanVariable.A, BooleanVariable.B);
431−
432− foreach(var variable in new BooleanVariable[] { BooleanVariable.A, BooleanVariable.B, }) {
433− queue.TryEnqueue(new VarExpression(variable), 1);
442+ foreach(var expression in availableExpressions) {
443+ queue.TryEnqueue(expression, 1);
434444 }
435445
436446 while(queue.Count != 0) {
@@ -442,7 +452,7 @@ namespace SolveAvdoshin
442452 continue;
443453 }
444454
445− if((curExperession.Eval() & 0xAA) == (targetExpression.Eval() & 0xAA)) {
455+ if((curExperession.Eval() & 0xAA) == (targetBinary.Eval() & 0xAA)) {
446456 return curExperession;
447457 }
448458