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); }
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); }