Пример #1
0
 public IProofStep GetProofStep()
 {
     if (null == proofStep)
     {
         // Assume was a premise
         proofStep = new ProofStepPremise(this);
     }
     return(proofStep);
 }
 public ProofStepFoChAssertFact(Clause implication, Literal fact,
                                IDictionary <Variable, ITerm> bindings, IProofStep predecessor)
 {
     this.implication = implication;
     this.fact        = fact;
     this.bindings    = bindings;
     if (null != predecessor)
     {
         predecessors.Add(predecessor);
     }
 }
Пример #3
0
        private void AddToProofSteps(IProofStep step)
        {
            if (!proofSteps.Contains(step))
            {
                proofSteps[0] = step;
            }
            else
            {
                proofSteps.Remove(step);
                proofSteps[0] = step;
            }
            IList <IProofStep> predecessors = step.GetPredecessorSteps();

            for (int i = predecessors.Count - 1; i >= 0; i--)
            {
                this.AddToProofSteps(predecessors[i]);
            }
        }
Пример #4
0
        private void CalcualteProofSteps()
        {
            proofSteps = new List <IProofStep>();
            this.AddToProofSteps(finalStep);

            // Move all premises to the front of the
            // list of steps
            int to = 0;

            for (int i = 0; i < proofSteps.Count; i++)
            {
                if (proofSteps[i] is ProofStepPremise)
                {
                    IProofStep m = proofSteps[i];
                    proofSteps.RemoveAt(i);
                    proofSteps[to] = m;
                    to++;
                }
            }

            // Move the Goals after the premises
            for (int i = 0; i < proofSteps.Count; i++)
            {
                if (proofSteps[i] is ProofStepGoal)
                {
                    IProofStep m = proofSteps[i];
                    proofSteps.RemoveAt(i);
                    proofSteps[to] = m;
                    to++;
                }
            }

            // Assign the step #s now that all the proof
            // steps have been unwound
            for (int i = 0; i < proofSteps.Count; i++)
            {
                proofSteps[i].SetStepNumber(i + 1);
            }
        }
Пример #5
0
 public ProofStepRenaming(object proof, IProofStep predecessor)
 {
     this.proof = proof;
     this.predecessors.Add(predecessor);
 }
Пример #6
0
        private bool MatchPremises(InferenceRule rule, FormulaMapping mapping, ref Proof proof, ref RuleStep step, int premiseIndex = 0)
        {
            if (premiseIndex >= rule.premises.Count)
            {
                return(true);
            }

            ISymbol premise = rule.premises[premiseIndex];

            List <MappingResult> nonRootMappings = new List <MappingResult>();

            for (int i = 0; i < truths.Count; i++)
            {
                IProofStep truth = truths[i];
                foreach (MappingResult mappingResult in FindFormulaMappings(premise, truth.Conclusion, mapping))
                {
                    if (mappingResult.isRoot)
                    {
                        step.AddReferredStep(truth);

                        if (MatchPremises(rule, mappingResult.mapping, ref proof, ref step, premiseIndex + 1))
                        {
                            break;
                        }

                        step.PopReferredStep();
                    }
                    else
                    {
                        // Do non-root options later for efficiency
                        nonRootMappings.Add(mappingResult);
                    }
                }

                if (step.referredSteps.Count >= rule.premises.Count)
                {
                    return(true);
                }
            }

            foreach (MappingResult mappingResult in nonRootMappings)
            {
                Proof newProof = TryProve(mappingResult.formula, rule, mappingResult.mapping, premiseIndex, ref step);
                if (newProof != null)
                {
                    proof.AddStepsFromProof(newProof);
                    return(true);
                }

                if (step.referredSteps.Count >= rule.premises.Count)
                {
                    return(true);
                }
            }

            if (mapping.Count >= rule.maxFormulaIndex)
            {
                RuleType lastUnreferredRuleBefore = lastUnreferredRule;

                if (rule.type == RuleType.Double_Negation_Elimination && lastUnreferredRule == RuleType.Double_Negation_Elimination)
                {
                    return(false);
                }

                lastUnreferredRule = rule.type;

                ISymbol mappedPremise = premise.ApplyMapping(mapping);
                Proof   newProof      = TryProve(mappedPremise, rule, mapping, premiseIndex, ref step);
                if (newProof != null)
                {
                    proof.AddStepsFromProof(newProof);
                    return(true);
                }

                lastUnreferredRule = lastUnreferredRuleBefore;
            }

            // Proof is impossible (invalid)
            return(false);
        }
Пример #7
0
 public ProofFinal(IProofStep finalStep, IDictionary <Variable, ITerm> answerBindings)
 {
     this.finalStep      = finalStep;
     this.answerBindings = answerBindings;
 }
Пример #8
0
 public void SetPredecessor(IProofStep predecessor)
 {
     predecessors.Clear();
     predecessors.Add(predecessor);
 }
Пример #9
0
 public void SetProofStep(IProofStep pStep)
 {
     this.proofStep = pStep;
 }
Пример #10
0
 public void AddProofStep(IProofStep step)
 {
     stepFinal = step;
 }
Пример #11
0
 public void AddProofStep(Clause implication, Literal fact,
                          IDictionary <Variable, ITerm> bindings)
 {
     stepFinal = new ProofStepFoChAssertFact(implication, fact,
                                             bindings, stepFinal);
 }