示例#1
0
        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();
        }
示例#2
0
        public static BooleanExpression FindMininalExpressionInBasis(int n, BooleanOperation[] ops,
                                                                     BooleanVariable[] vars, ExpressionSearchMode mode = ExpressionSearchMode.CountOps)
        {
            var queue            = new ImprovisedPriorityQueue <BooleanExpression>(20);
            var knownTruthTables = new HashSet <byte>();
            var knownExpressions = new HashSet <BooleanExpression>();

            foreach (var variable in vars)
            {
                queue.TryEnqueue(new VarExpression(variable), 1);
            }

            while (queue.Count != 0)
            {
                var curExperession = queue.Dequeue();

                byte truthTable = curExperession.Eval();

                if (knownTruthTables.Contains(truthTable))
                {
                    continue;
                }

                if (curExperession.Eval() == n)
                {
                    return(curExperession);
                }

                knownExpressions.Add(curExperession);
                knownTruthTables.Add(truthTable);

                foreach (var anotherExpression in knownExpressions)
                {
                    foreach (var neighbourExpression in curExperession.CombineWith(anotherExpression, ops))
                    {
                        queue.TryEnqueue(neighbourExpression, mode == ExpressionSearchMode.CountBlocks
                                                        ? neighbourExpression.CountBlocks() : neighbourExpression.CountOps());
                    }
                }
            }

            throw new CouldntFindExpressionException();
        }