示例#1
0
        private static IEnumerable<Implication> ApplyAmbiguitiesForLiteral(Expression literal, Implication rule,
            IDictionary<ISentenceForm, ICollection<Ambiguity>> ambiguitiesByOriginalForm, ISentenceFormModel model)
        {
            var results = new List<Implication> { rule };
            var varGen = new UnusedVariableGenerator(rule);

            var fact = literal as Fact;
            if (fact != null)
            {
                ISentenceForm form = model.GetSentenceForm(fact);
                ICollection<Ambiguity> ambiguities;
                if (ambiguitiesByOriginalForm.TryGetValue(form, out ambiguities))
                {
                    IEnumerable<Ambiguity> applicableAmiguities = ambiguities.Where(ambiguity => ambiguity.Applies(fact));
                    IEnumerable<Substitution> substitutions = applicableAmiguities.Select(ambiguity => ambiguity.GetReplacementAssignment(fact, varGen));
                    IEnumerable<Implication> implications = substitutions.Select(substitution => (Implication)rule.ApplySubstitution(substitution));
                    results.AddRange(implications);
                }
            }
            else if (literal is Negation)
            {
                // Do nothing. Variables must appear in a positive literal in the
                // rule, and will be handled there.
            }
            else if (literal is Disjunction)
            {
                throw new Exception("ORs should have been removed");
                //} else if (literal is GdlDistinct) {
                // Do nothing
            }

            return results;
        }
示例#2
0
            public Substitution GetReplacementAssignment(Fact sentence, UnusedVariableGenerator varGen)
            {
                Debug.Assert(Applies(sentence));

                var assignment = new Substitution();
                List<Term> tuple = sentence.NestedTerms.ToList();
                foreach (int varIndex in _replacementsByOriginalTupleIndex.Keys)
                {
                    TermFunction function = _replacementsByOriginalTupleIndex[varIndex];

                    TermFunction replacementFunction = varGen.ReplaceVariablesAndConstants(function);
                    assignment.AddMapping((TermVariable)tuple[varIndex], replacementFunction);
                }
                return assignment;
            }