Beispiel #1
0
        private Substitution BackChainList(Queue <ISentence> sentences, Substitution substitution)
        {
            Substitution answer = new Substitution();

            if (sentences.Count == 0)
            {
                return(substitution);
            }
            var q = sentences.Dequeue();

            foreach (var sen in Sentences)
            {
                var sub = Unify(q, sen);
                if (sub.Successful)
                {
                    substitution.Compose(sub);
                }
            }
            foreach (var sen in Sentences
                     .Select(s => DropOuterQuantifiers(s))
                     .Where(s => s.GetSentenceType() == SentenceType.SentenceConnectiveSentence && (s as SentenceConnectiveSentence).Connective == "->")
                     .Select(s => s as SentenceConnectiveSentence))
            {
                var sub2 = Unify(q, sen.Sentence2);
                if (sub2.Successful)
                {
                    var qq = new Queue <ISentence>(SentenceConnectiveSentence.GetAnticedents(sen));
                    answer.Compose(BackChainList(new Queue <ISentence>(qq.Select(x => x.Substitute(sub2))), substitution.Compose(sub2)));
                }
            }
            return(answer.Compose(BackChainList(sentences, substitution)));
        }
Beispiel #2
0
 public static void FindAndInfer(FilmKnowledgeBase kb, List <ISentence> premises, ISentence conclusion, Substitution s)
 {
     if (premises.Count == 0)
     {
         ForwardChain(kb, conclusion.Substitute(s));
     }
     foreach (var kbSentence in kb.Sentences)
     {
         var unifyResult = Unify(kbSentence, premises.First().Substitute(s));
         if (unifyResult.Successful)
         {
             FindAndInfer(kb, premises.Skip(1).ToList(), conclusion, s.Compose(unifyResult));
         }
     }
 }