예제 #1
0
        private static IEnumerable<Substitution> Conjunction(ISubstitutions firstSubst, ISubstitutions secondSubst)
        {
            var iter1 = firstSubst.GetEnumerator();
            var iter2 = secondSubst.GetEnumerator();

            var resSubst = GetEmptySubst();

            bool firstNotEmpty = iter1.MoveNext(), secondNotEmpty = iter2.MoveNext();

            while (firstNotEmpty && secondNotEmpty)
            {
                resSubst = resSubst.Unify(iter1.Current);
                if (resSubst == null)
                    return null;

                firstNotEmpty = iter1.MoveNext();

                resSubst = resSubst.Unify(iter2.Current);
                if (resSubst == null)
                    return null;

                secondNotEmpty = iter2.MoveNext();
            }

            if (firstNotEmpty)
                return ConjunctFinite(resSubst, new InfiniteSubstitutions(iter1.EnumerateFromCurrent())); //TODO Fabric

            if (secondNotEmpty)
                return ConjunctFinite(resSubst, new InfiniteSubstitutions(iter2.EnumerateFromCurrent())); //TODO Fabric

            return resSubst;
        }
예제 #2
0
 private static IEnumerable<Substitution> ConjunctFinite(ISubstitutions finit, ISubstitutions potentialInfinite)
 {
     ISubstitutions res = potentialInfinite;
     foreach (var subst in finit)
     {
         res = res.Unify(subst);
         if (res == null)
             return null;
     }
     return res;
 }
예제 #3
0
 private static IEnumerable<IEnumerable<Substitution>> Conjunction(ISubstitutions subst, Goal goal1, Goal goal2)
 {
     foreach (var firstSubst in goal1(subst))
     {
         foreach (var secondSubst in goal2(subst))
         {
             var resSubst = Conjunction(firstSubst, secondSubst);
             if (resSubst != null)
                 yield return resSubst;
         }
     }
 }
예제 #4
0
 private static IEnumerable <IEnumerable <Substitution> > Conjunction(ISubstitutions subst, Goal goal1, Goal goal2)
 {
     foreach (var firstSubst in goal1(subst))
     {
         foreach (var secondSubst in goal2(subst))
         {
             var resSubst = Conjunction(firstSubst, secondSubst);
             if (resSubst != null)
             {
                 yield return(resSubst);
             }
         }
     }
 }
예제 #5
0
        private static IEnumerable <Substitution> ConjunctFinite(ISubstitutions finit, ISubstitutions potentialInfinite)
        {
            ISubstitutions res = potentialInfinite;

            foreach (var subst in finit)
            {
                res = res.Unify(subst);
                if (res == null)
                {
                    return(null);
                }
            }
            return(res);
        }
예제 #6
0
        private static IEnumerable <Substitution> Conjunction(ISubstitutions firstSubst, ISubstitutions secondSubst)
        {
            var iter1 = firstSubst.GetEnumerator();
            var iter2 = secondSubst.GetEnumerator();

            var resSubst = GetEmptySubst();

            bool firstNotEmpty = iter1.MoveNext(), secondNotEmpty = iter2.MoveNext();

            while (firstNotEmpty && secondNotEmpty)
            {
                resSubst = resSubst.Unify(iter1.Current);
                if (resSubst == null)
                {
                    return(null);
                }

                firstNotEmpty = iter1.MoveNext();

                resSubst = resSubst.Unify(iter2.Current);
                if (resSubst == null)
                {
                    return(null);
                }

                secondNotEmpty = iter2.MoveNext();
            }

            if (firstNotEmpty)
            {
                return(ConjunctFinite(resSubst, new InfiniteSubstitutions(iter1.EnumerateFromCurrent())));                //TODO Fabric
            }
            if (secondNotEmpty)
            {
                return(ConjunctFinite(resSubst, new InfiniteSubstitutions(iter2.EnumerateFromCurrent())));                //TODO Fabric
            }
            return(resSubst);
        }
예제 #7
0
        private static IEnumerable <IEnumerable <Substitution> > Disjunction(ISubstitutions subst, Goal goal1, Goal goal2)
        {
            var iter1 = goal1(subst).GetEnumerator();
            var iter2 = goal2(subst).GetEnumerator();

            bool firstNotEmpty = iter1.MoveNext(), secondNotEmpty = iter2.MoveNext();

            while (firstNotEmpty || secondNotEmpty)
            {
                if (firstNotEmpty)
                {
                    yield return(iter1.Current);

                    firstNotEmpty = iter1.MoveNext();
                }

                if (secondNotEmpty)
                {
                    yield return(iter2.Current);

                    secondNotEmpty = iter2.MoveNext();
                }
            }
        }
예제 #8
0
        private static IEnumerable<IEnumerable<Substitution>> Disjunction(ISubstitutions subst, Goal goal1, Goal goal2)
        {
            var iter1 = goal1(subst).GetEnumerator();
            var iter2 = goal2(subst).GetEnumerator();

            bool firstNotEmpty = iter1.MoveNext(), secondNotEmpty = iter2.MoveNext();

            while (firstNotEmpty || secondNotEmpty)
            {
                if (firstNotEmpty)
                {
                    yield return iter1.Current;
                    firstNotEmpty = iter1.MoveNext();
                }

                if (secondNotEmpty)
                {
                    yield return iter2.Current;
                    secondNotEmpty = iter2.MoveNext();
                }
            }
        }