Example #1
0
            private List <Expression> Merge(Expression expr, List <Expression> first, List <Expression> second, Dictionary <Constant, bool> valuesFirst, Dictionary <Constant, bool> valuesSecond, int level)
            {
                var keys = valuesFirst.Keys.ToList();

                keys.Sort((x, y) => - 1 * x.Value.CompareTo(y.Value));
                List <Expression> assumptionA = new List <Expression>();
                List <Expression> assumptionB = new List <Expression>();

                for (int i = 0; i < keys.Count - level; i++)
                {
                    if (valuesFirst[keys[i]])
                    {
                        assumptionA.Add(keys[i]);
                    }
                    else
                    {
                        assumptionA.Add(new Negation(keys[i]));
                    }

                    if (valuesSecond[keys[i]])
                    {
                        assumptionB.Add(keys[i]);
                    }
                    else
                    {
                        assumptionB.Add(new Negation(keys[i]));
                    }
                }

                first  = Deduction(first, assumptionA);
                second = Deduction(second, assumptionB);
                var aOrNotA = ProofCollection.GetAOrNotA();

                for (int i = 0; i < aOrNotA.Count; i++)
                {
                    aOrNotA[i] = SubstituteExprsToExpr(aOrNotA[i], assumptionB.Last(), null);
                }

                var parser = new Parser();

                var axiom8 = SubstituteExprsToExpr(parser.Parse("((A->B)->(!A->B)->(A|!A)->B)"), assumptionB.Last(), expr);
                var mp1    = SubstituteExprsToExpr(parser.Parse("((!A->B)->(A|!A)->B)"), assumptionB.Last(), expr);

                var mp2 = SubstituteExprsToExpr(parser.Parse("((A|!A)->B)"), assumptionB.Last(), expr);


                var rv = new List <Expression>();

                rv.AddRange(first);
                rv.AddRange(second);
                rv.AddRange(aOrNotA);
                rv.Add(axiom8);
                rv.Add(mp1);
                rv.Add(mp2);

                rv.Add(expr.Clone());
                return(rv);
            }