private BALSetting <A, S> CheckBALSideCondition(Func <Node <A, S>, StackSymbolSequenceSet <S> > sideSelector, Node <A, S> premise)
        {
            Assertion.Assert(SelfAndPredecessors().Contains(this), "the premise has to be a predecessor of the node");

            var branch = GetBranchToHereFromExlusively(premise);

            if (!branch.All(n => n.OperationToHere is Operation <A, S> .UNF))
            {
                return(null);
            }

            var branchWord = branch.Select(n => ((Operation <A, S> .UNF)n.OperationToHere).Symbol);

            var premiseSide = sideSelector(premise);
            var ownSide     = sideSelector(this);

            var premiseHeadTail = premiseSide.Get1HeadTailForm();

            var expOwnHeads = premiseHeadTail.Head.StackSequenceSet.Select(stackSymbol => sda.ApplyWordToStackSymbolSequence(stackSymbol, branchWord)).ToList();

            if (!CheckBALSideCondition1(expOwnHeads, premiseHeadTail.Tail))
            {
                return(null);
            }

            var expOwnExprUnflattend = expOwnHeads.Zip(premiseHeadTail.Tail.StackSequenceSet, (ownHead, tail) => ownHead.Multiply(tail)).ToList();
            var epxOwnExpr           = StackSymbolSequenceSet <S> .Flatten(expOwnExprUnflattend);

            //Is it correct, that it is unnecessary to verify that the expression is in valid head/tail-form (that means that the
            //heads only are admissible)? I think it is, as the 1-k-form of the premise is valid head/tail-form and according to Chapter 4 Proposition 4
            //the derived expression should also be in valid head/tail-form
            if (!ownSide.Equals(epxOwnExpr))
            {
                return(null);
            }

            if (CheckBALSideCondition2(expOwnHeads, premiseHeadTail.Head, branch))
            {
                var premiseHeads = premiseHeadTail.Head.StackSequenceSet.Select(x =>
                {
                    Assertion.Assert(x.StackSequence.Count() == 1, "x should contain exactly one stack symbol");
                    return(x.StackSequence.First());
                }).ToList();

                return(new BALSetting <A, S>(premise, expOwnHeads, premiseHeads));
            }

            return(null);
        }
        private void ApplyBAL(Operation <A, S> .BAL.BalType balType, BALSetting <A, S> bALSetting)
        {
            var oppositeSideSelector = Operation <A, S> .BAL.GetOppositeSideSelector(balType);

            var F       = oppositeSideSelector(bALSetting.Premise);
            var bottoms = bALSetting.PremiseHeads.Select(x => sda.ApplyWordToStackSymbolSequenceSet(F, sda.ShortestWordsOfStackSymbols[x])).ToList();

            var op = Operation <A, S> .BAL.CreateInstanceOfType(balType, bottoms);

            var child = new Node <A, S>(op, this, sda, symbols);

            Children = new List <Node <A, S> >()
            {
                child
            };

            var modifiedSideUnflattend = bALSetting.OwnHeads.Zip(bottoms, (head, bottom) => head.Multiply(bottom)).ToList();
            var modifiedSite           = StackSymbolSequenceSet <S> .Flatten(modifiedSideUnflattend);

            op.SetCorrespondingSide(child, modifiedSite, oppositeSideSelector(this));
        }
Example #3
0
        /// <summary>
        /// tries to bring this set and the other set into head/tail-form, so that both have the same tails
        /// </summary>
        /// <param name="other"></param>
        /// <returns></returns>
        internal Tuple <HeadTailForm <S> > TryToGetHeadTailForm(StackSymbolSequenceSet <S> other)
        {
            //FIXME: replace this whole function by another algo, as it will not work like this
            var ownSetWithInvsereOrder = OrderByStackSequencesInverse();
            var otherWithInverseOrder  = other.OrderByStackSequencesInverse();
            var setsOrderByLength      = new List <StackSymbolSequenceSet <S> >()
            {
                ownSetWithInvsereOrder, otherWithInverseOrder
            }.OrderBy(s => s.StackSequenceSet.Count()).ToList();

            var headsOfSmallerSet = new List <StackSymbolSequence <S> >();
            var headsOfLongerSet  = new List <StackSymbolSequence <S> >();
            var tails             = new List <StackSymbolSequence <S> >();

            for (int i = 0; i < setsOrderByLength.First().StackSequenceSet.Count(); i++)
            {
                var firstStackSequence  = setsOrderByLength[0].StackSequenceSet.ElementAt(i);
                var secondStackSequence = setsOrderByLength[1].StackSequenceSet.ElementAt(i);

                var tail = firstStackSequence.GetLongestPossibleCommonTail(secondStackSequence);
                headsOfSmallerSet.Add(firstStackSequence.GetHeadWithRespectToTail(tail));
                headsOfLongerSet.Add(secondStackSequence.GetHeadWithRespectToTail(tail));
                tails.Add(tail);
            }

            var tailsOrderedByLength = tails.OrderByDescending(t => t.StackSequence.Count());

            var smallerLentgh = setsOrderByLength[0].StackSequenceSet.Count();
            var remaining     = setsOrderByLength[1].StackSequenceSet.Count() - smallerLentgh;

            for (int i = 0; i < remaining; i++)
            {
                var next = setsOrderByLength[1].StackSequenceSet.ElementAt(smallerLentgh + i);
                var tail = tailsOrderedByLength.FirstOrDefault(t => next.EndsWith(t));
                //TODO: ...
            }
            return(null); //FIXME
        }
 internal override void SetCorrespondingSide(Node <A, S> node, StackSymbolSequenceSet <S> modifiedSite, StackSymbolSequenceSet <S> otherSide)
 {
     node.LeftHand  = modifiedSite;
     node.RightHand = otherSide;
 }
 internal abstract void SetCorrespondingSide(Node <A, S> node, StackSymbolSequenceSet <S> modifiedSite, StackSymbolSequenceSet <S> otherSide);
 public Node(StackSymbolSequenceSet <S> leftHand, StackSymbolSequenceSet <S> rightHand, Operation <A, S> operationToHere, Node <A, S> parent, DeterminisedSDA <A, S> sda, IEnumerable <A> symbols)
     : this(operationToHere, parent, sda, symbols)
 {
     LeftHand  = leftHand;
     RightHand = rightHand;
 }
        private bool CheckBALSideCondition2(List <StackSymbolSequenceSet <S> > ownHeads, StackSymbolSequenceSet <S> premiseHeads, IEnumerable <Node <A, S> > branch)
        {
            var premiseHeadsAndOwnHeads             = premiseHeads.StackSequenceSet.Zip(ownHeads, (stackSymbol, ownHead) => new { stackSymbol, ownHead });
            var premiseHeadsWhereOwnHeadNotEmptySet = premiseHeadsAndOwnHeads.Where(t => !t.ownHead.IsEmptySet()).Select(t => t.stackSymbol).ToList();

            var maxPremiseHeadNorm = premiseHeadsWhereOwnHeadNotEmptySet.Max(x =>
            {
                Assertion.Assert(x.StackSequence.Count() == 1, "the premise heads have to have length one");
                return(sda.ShortestWordsOfStackSymbols[x.StackSequence.First()].Count());
            });

            return(branch.Count() == maxPremiseHeadNorm);
        }
        private bool CheckBALSideCondition1(List <StackSymbolSequenceSet <S> > ownHeads, StackSymbolSequenceSet <S> premiseTail)
        {
            var ownHeadsAreNotEmpty = ownHeads.All(h => !h.IsEpsilonSet());

            if (!ownHeadsAreNotEmpty)
            {
                return(false);
            }

            var atLeastOneTailIsNotEmpty = premiseTail.StackSequenceSet.Any(s => !s.IsEpsilon());

            return(atLeastOneTailIsNotEmpty);
        }
Example #9
0
 public bool Equals(StackSymbolSequenceSet <S> other)
 {
     //FIXME: either use HashSet or order StackSequenceSet before SequenceEqual
     //FIXME: HashSet has probably better performance than ordering
     return(StackSequenceSet.OrderBy(s => s.Id).SequenceEqual(other.StackSequenceSet.OrderBy(s => s.Id)));
 }
Example #10
0
        public StackSymbolSequenceSet <S> Multiply(StackSymbolSequenceSet <S> stackSequenceSet)
        {
            var res = stackSequenceSet.StackSequenceSet.SelectMany(s => Multiply(s).StackSequenceSet).ToList();

            return(new StackSymbolSequenceSet <S>(res));
        }
 public HeadTailForm(StackSymbolSequenceSet <S> head, StackSymbolSequenceSet <S> tail)
 {
     Head = head;
     Tail = tail;
 }