Exemplo n.º 1
0
 public override string GetFullKey()
 {
     return("(" + GetKeyFactorisation() + "/" + m_elementDeArbre.GetFullKey() + ")");
 }
        public override void Simplifier()
        {
            //Simplifie les fils
            foreach (CElementDeArbreOperationnel elt in Fils)
            {
                elt.Simplifier();
            }

            m_listeFils.Sort();
            //Si c'est un OU et qu'il contient un 1, le ou ne sert à rien
            //1+a+b+c = 1
            if (GetType() == typeof(CElementDeArbreOperationnelOperateurOu))
            {
                if (m_listeFils.ToArray().FirstOrDefault(f => f is CElementDeArbreOperationnelTrue) != null)
                {
                    m_listeFils.Clear();
                    return;
                }
            }


            bool bChange = true;

            while (bChange)
            {
                bChange = false;

                /*Fait remonter les fils du même type sur ses propres paramètres
                 * suivant la règle a+(b+c) = a+b+c et a.(b.c) = a.b.c
                 * */
                foreach (CElementDeArbreOperationnelOperateur element in from f in m_listeFils.ToArray()
                         where
                         f.GetType() == GetType()
                         select f as CElementDeArbreOperationnelOperateur)
                {
                    foreach (CElementDeArbreOperationnel fils in element.Fils)
                    {
                        AddFils(fils);
                    }
                    RemoveFils(element);
                    bChange = true;
                }

                /*Supprime les doublons
                 * suivant la règle a+a = a et a.a = a ou les combine, s'il s'agit de trucs
                 * plus compliqués (comme des sous schémas)
                 * */
                Dictionary <string, CElementDeArbreOperationnel> dicElements = new Dictionary <string, CElementDeArbreOperationnel>();
                foreach (CElementDeArbreOperationnel element in m_listeFils.ToArray())
                {
                    if (dicElements.Keys.Contains(element.GetKeyFactorisation()))
                    {
                        IElementDeArbreOperationnelAEgaliteComplexe elementComplexe = element as IElementDeArbreOperationnelAEgaliteComplexe;
                        if (elementComplexe != null)
                        {
                            IElementDeArbreOperationnelAEgaliteComplexe autreElement = dicElements[element.GetKeyFactorisation()] as IElementDeArbreOperationnelAEgaliteComplexe;
                            CElementDeArbreOperationnelOperateur        op;
                            if (GetType() == typeof(CElementDeArbreOperationnelOperateurEt))
                            {
                                op = new CElementDeArbreOperationnelOperateurOu(null);
                            }
                            else
                            {
                                op = new CElementDeArbreOperationnelOperateurEt(null);
                            }
                            if (autreElement.CombineKeyEgal(op, element))
                            {
                                RemoveFils(element);
                            }
                            bChange = true;
                        }
                        else
                        {
                            CElementDeArbreOperationnel autreElement = dicElements[element.GetKeyFactorisation()];
                            if (autreElement.GetFullKey() == element.GetFullKey())
                            {
                                RemoveFils(element);
                                bChange = true;
                            }
                        }
                    }
                    else
                    {
                        dicElements[element.GetKeyFactorisation()] = element;
                    }
                }

                //Supprime les opérateurs avec un zéro ou seul paramètere
                foreach (CElementDeArbreOperationnelOperateur element in from f in m_listeFils.ToArray()
                         where
                         typeof(CElementDeArbreOperationnelOperateur).IsAssignableFrom(f.GetType()) &&
                         ((CElementDeArbreOperationnelOperateur)f).Fils.Count() <= 1
                         select f as CElementDeArbreOperationnelOperateur)
                {
                    if (element.Fils.Count() == 1)
                    {
                        AddFils(element.Fils.ElementAt(0));
                    }
                    m_listeFils.Remove(element);
                    bChange = true;
                }

                if (GetType() == typeof(CElementDeArbreOperationnelOperateurEt))
                {
                    foreach (CElementDeArbreOperationnelTrue opTrue in from f in Fils
                             where f is CElementDeArbreOperationnelTrue
                             select f as CElementDeArbreOperationnelTrue)
                    {
                        RemoveFils(opTrue);
                        bChange = true;
                    }
                }
            }
            //if ( TypeOperateur == ETypeOperateur.OU )
            Factoriser();
            m_listeFils.Sort();
        }