示例#1
0
        private static void AddingFormulas(Inference inference, HashSet <Formula> formulas, Formula target)
        {
            var form = new HashSet <Formula>();

            while (true)
            {
                foreach (var f in form)
                {
                    if (f.Equals(target) == false)
                    {
                        lock (inference)
                        {
                            if (inference.Contains(target))
                            {
                                return;
                            }
                            inference.Push(f);
                        }
                    }
                }

                lock (formulas)
                {
                    form.UnionWith(formulas);
                }
            }
        }
示例#2
0
        private static void GenAxiom(Inference inference, List <Formula> formulas, HashSet <Formula> allFormulas,
                                     Formula target, Axiom a)
        {
            foreach (var f1 in formulas)
            {
                foreach (var f2 in formulas)
                {
                    foreach (var f3 in formulas)
                    {
                        var f = SubstituteInFormula(a, f1, f2, f3);
                        if (f.Equals(target))
                        {
                            continue;
                        }
                        bool ok;
                        lock (inference)
                        {
                            if (inference.Contains(target))
                            {
                                return;
                            }
                            ok = inference.Push(f);
                        }

                        lock (allFormulas)
                        {
                            if (ok)
                            {
                                ParseFormula(f, allFormulas);
                            }
                        }
                    }
                }
            }
        }
示例#3
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);
        }
示例#4
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);
        }