Exemplo n.º 1
0
        public static bool IsSecondType(Multioperation4 op)
        {
            var set = new ArrSet4(op);

            if (set.Count <= 3 || set.Count > 4)
            {
                return(false);
            }

            var first = op & Multioperation4.E;

            if (first != Multioperation4.E)
            {
                return(false);
            }
            var mu = !op;

            if (mu != op)
            {
                return(false);
            }
            var op2 = op * op;

            if (op2 != Multioperation4.All)
            {
                return(false);
            }
            return(true);
        }
Exemplo n.º 2
0
        /// <summary>
        /// Generate the whole algebra
        /// </summary>
        /// <returns>Number of multioperations in algebra</returns>
        /// <param name="op">Multioperation generator</param>
        public static int CheckOp4Arr(Multioperation4 op)
        {
            var set = new ArrSet4(op);

            if (set.Count <= 3)
            {
                return(set.Count);
            }

            var prevCount = 0;

            // generate new multioperation while it is possible
            while (set.Count < 65536 && prevCount != set.Count)
            {
                prevCount = set.Count;

                // add mu(f) multioperations
                for (int i = 0; i < set.Count; i++)
                {
                    set.Add(!set[i]);
                }

                for (int i = 0; i < set.Count; i++)
                {
                    var op1 = set[i];

                    // For multioperation tetha: (tetha * x)(x) = (tetha)
                    // and (tetha intersection f)(x) = (tetha)
                    // so we could skip this step
                    if (op1 == Multioperation4.Zero)
                    {
                        continue;
                    }
                    for (int j = 0; j < set.Count; j++)
                    {
                        var op2 = set[j];
                        // For multioperation tetha: (f * tetha)(x) = (tetha)
                        // and (f intersection tetha)(x) = (tetha)
                        // so we could skip this step too
                        if (op2 == Multioperation4.Zero)
                        {
                            continue;
                        }
                        // (f * g)(x)
                        var opSup = op1 * op2;
                        // (f intersection g)(x)
                        var opUn = op1 & op2;
                        set.Add(opSup);
                        set.Add(opUn);
                        if (op1 == op2)
                        {
                            continue;
                        }
                        // (g * f)(x)
                        opSup = op2 * op1;
                        set.Add(opSup);
                    }
                }
            }
            return(set.Count);
        }