示例#1
0
        public static Inference FindInference(Hypotheses hypotheses, Formula target)
        {
            var inference = new Inference(hypotheses);

            if (inference.Push(target))
            {
                inference.Minimize();
                return(inference);
            }

            var formulas = new HashSet <Formula>();

            if (hypotheses is null == false)
            {
                foreach (var h in hypotheses)
                {
                    inference.Push(h);
                    formulas.Add(h);
                }
            }

            ParseFormula(target, formulas);

            var addingFormulas = new Thread(() => AddingFormulas(inference, formulas, target));
            var genFormulas    = new Thread(() => GenFormulas(inference, formulas, target));

            addingFormulas.Start();
            genFormulas.Start();

            while (true)
            {
                lock (inference)
                {
                    if (inference.Push(target) || inference.Contains(target))
                    {
                        break;
                    }
                }

                Thread.Sleep(1000);
            }

            addingFormulas.Abort();
            genFormulas.Abort();

            inference.Minimize();
            return(inference);
        }
        public Inference BuildInference()
        {
            if (_inference != null)
            {
                return(_inference);
            }
            var inference = new Inference(Hypotheses);

            if (inference.Push(Target))
            {
                return(_inference = inference);
            }

            var addedFormulas    = new HashSet <Formula>();
            var newAddedFormulas = new HashSet <Formula>();
            var queue            = new HashSet <Formula>();
            var newQueue         = new HashSet <Formula>();

            ParseFormula(Target, queue);

            if (Hypotheses != null)
            {
                foreach (var h in Hypotheses)
                {
                    if (inference.Push(h))
                    {
                        addedFormulas.Add(h);
                    }
                }
            }

            foreach (var q in queue)
            {
                addedFormulas.Add(q);
            }

            while (true)
            {
                foreach (var aF in addedFormulas)
                {
                    foreach (var q in queue)
                    {
                        var f = SubstituteInFormula(new Formula(Impl), aF, q, null);
                        if (inference.Push(f))
                        {
                            newAddedFormulas.Add(f);
                        }
                        else
                        {
                            newQueue.Add(f);
                        }
                    }
                }

                foreach (var q in newQueue)
                {
                    queue.Add(q);
                }
                newQueue.Clear();

                foreach (var naF in newAddedFormulas)
                {
                    addedFormulas.Add(naF);
                }
                newAddedFormulas.Clear();

                var ok = true;
                while (ok)
                {
                    ok = false;
                    foreach (var f in queue)
                    {
                        if (inference.Push(f))
                        {
                            if (f.Equals(Target))
                            {
                                ok = false;
                                break;
                            }

                            ok = true;
                            newAddedFormulas.Add(f);
                        }
                    }
                }

                foreach (var naF in newAddedFormulas)
                {
                    addedFormulas.Add(naF);
                    queue.Remove(naF);
                }

                newAddedFormulas.Clear();

                if (inference.Length != 0 && inference.LastFormula.Equals(Target))
                {
                    break;
                }

                if (inference.Push(Target))
                {
                    break;
                }
            }

            inference.Minimize();
            return(_inference = inference);
        }
示例#3
0
        public static Inference FindInference(Formula target, Hypotheses hypotheses)
        {
            var inference = new Inference(hypotheses);

            if (inference.Push(target))
            {
                inference.Minimize();
                return(inference);
            }
            var formulas = new HashSet <Formula>();

            if (hypotheses is null == false)
            {
                foreach (var h in hypotheses)
                {
                    inference.Push(h);
                    formulas.Add(h);
                }
            }

            ParseFormula(target, formulas);

            while (true)
            {
                var newF = new HashSet <Formula>();

                //foreach (var a in Axioms.GetAxioms())
                //{
                //    GenAxioms(target, formulas, a, inference, newF);
                //}

                Parallel.ForEach(Axioms.GetAxioms(), a => GenAxioms(target, formulas, a, inference, newF));

                foreach (var f in newF)
                {
                    formulas.Add(f);
                }
                newF.Clear();

                var ok = true;
                while (ok)
                {
                    ok = false;
                    foreach (var f in formulas)
                    {
                        if (inference.Push(f))
                        {
                            ok = true;
                            if (target.Equals(f))
                            {
                                ok = false;
                                break;
                            }
                        }
                    }
                }

                if (inference.Contains(target))
                {
                    break;
                }
            }

            inference.Minimize();
            return(inference);
        }