コード例 #1
0
        /// <summary>
        /// Describe the state information, including original states if determinized, as well as counters.
        /// </summary>
        public override string DescribeState(int state)
        {
            string s;

            if (!stateDescr.TryGetValue(state, out s))
            {
                s = SpecialCharacters.S(stateDescr.Count);
                stateDescr[state] = s;
            }

            var mems = new List <int>(stateBuilder.GetMembers(state));

            mems.Sort();
            if (!__hidePowersets)
            {
                s += "\n" + "{";
                foreach (var q in mems)
                {
                    if (!s.EndsWith("{"))
                    {
                        s += ",";
                    }
                    s += SpecialCharacters.q(q);
                }
                s += "}";
            }
            var state_counters      = GetCountersOfState(state);
            var state_counters_list = new List <int>(state_counters);

            state_counters_list.Sort();
            foreach (var c in state_counters_list)
            {
                s += "\n";
                s += "(" + SpecialCharacters.c(c) + ")";
                //s += "(" + counters[c].LowerBound +
                //    SpecialCharacters.LEQ + SpecialCharacters.Cntr(c) + SpecialCharacters.LEQ + counters[c].UpperBound + ")";
                if (finalCounterSet.Contains(c))
                {
                    s += SpecialCharacters.XI_LOWERCASE + SpecialCharacters.ToSubscript(c);
                    s += SpecialCharacters.CHECKMARK;
                }
            }
            return(s);
        }
コード例 #2
0
 /// <summary>
 /// Produces 'q' with subscript i
 /// </summary>
 public static string q(int i)
 {
     return("q" + SpecialCharacters.ToSubscript(i));
 }
コード例 #3
0
        public static string DescribeCondition <S>(CsAlgebra <S> algebra, CsCondition cond, int i)
        {
            string c        = SpecialCharacters.c(i);
            string canExit  = SpecialCharacters.XI_LOWERCASE + SpecialCharacters.ToSubscript(i);
            string canIncr  = SpecialCharacters.IOTA_LOWERCASE + SpecialCharacters.ToSubscript(i);
            char   and      = SpecialCharacters.AND;
            char   or       = SpecialCharacters.OR;
            char   not      = SpecialCharacters.NOT;
            string empty    = string.Format("{0}={1}", c, SpecialCharacters.EMPTYSET);
            string nonempty = string.Format("{0}{1}{2}", c, SpecialCharacters.NEQ, SpecialCharacters.EMPTYSET);
            string _true    = SpecialCharacters.TOP.ToString();
            string _false   = SpecialCharacters.BOT.ToString();

            switch (cond)
            {
            case CsCondition.TRUE:
                return(_true);

            case CsCondition.FALSE:
                return(_false);

            case CsCondition.EMPTY:
                return(empty);

            case CsCondition.NONEMPTY:
                return(nonempty);

            case CsCondition.LOW:
                //return string.Format("{0}{2}{3}{4}max({0})<{1}", SpecialCharacters.Cntr(i), algebra.GetCounter(i).LowerBound, SpecialCharacters.NEQ, SpecialCharacters.EMPTYSET, SpecialCharacters.AND);
                //return canIncr + and + not + canExit;
                return(not + canExit);

            case CsCondition.HIGH:
                //return string.Format("{0}={{{1}}}", SpecialCharacters.Cntr(i), algebra.GetCounter(i).UpperBound);
                //return not + canIncr + and + canExit;
                return(not + canIncr);

            case CsCondition.CANEXIT:
                //return string.Format("{0}{1}{2}", SpecialCharacters.Cntr(i), SpecialCharacters.GEQ, algebra.GetCounter(i).LowerBound);
                return(canExit);

            case CsCondition.CANNOTEXIT:
                //return string.Format("{0}{1}{2}", SpecialCharacters.Cntr(i), SpecialCharacters.NOTGEQ, algebra.GetCounter(i).LowerBound);
                return(not + canExit);

            case CsCondition.CANLOOP:
                //return string.Format("{0}+1{1}{2}", SpecialCharacters.Cntr(i), SpecialCharacters.NEQ, SpecialCharacters.EMPTYSET);
                //return string.Format("{0}x{1}{2}(x<{3})", SpecialCharacters.EXISTS, SpecialCharacters.IN, SpecialCharacters.Cntr(i), algebra.GetCounter(i).UpperBound);
                return(canIncr);

            case CsCondition.CANNOTLOOP:
                //return string.Format("{0}+1{1}{2}", SpecialCharacters.Cntr(i), "=", SpecialCharacters.EMPTYSET);
                //return string.Format("{0}x{1}{2}(x<{3})", SpecialCharacters.NOTEXISTS, SpecialCharacters.IN, SpecialCharacters.Cntr(i), algebra.GetCounter(i).UpperBound);
                return(not + canIncr);

            case CsCondition.MIDDLE:
                //return string.Format("{2}{4}{5}{6}{0}{1}max({2})<{3}", algebra.GetCounter(i).LowerBound, SpecialCharacters.LEQ, SpecialCharacters.Cntr(i), algebra.GetCounter(i).UpperBound, SpecialCharacters.NEQ, SpecialCharacters.EMPTYSET, SpecialCharacters.AND);
                return(canIncr + and + canExit);

                #region these cases should not occur
            case CsCondition.LOWorHIGH:
                //return string.Format("({0}{1}{2})", DescribeCondition<S>(algebra, CsCondition.LOW, i), SpecialCharacters.OR, DescribeCondition<S>(algebra, CsCondition.HIGH, i));
                return("(" + not + canIncr + or + not + canExit + ")");

            case CsCondition.EMPTYorCANEXIT:
                return("(" + empty + or + canExit + ")");

            case CsCondition.EMPTYorCANLOOP:
                return("(" + empty + or + canIncr + ")");

            case CsCondition.EMPTYorHIGHorLOW:
                return("(" + empty + or + not + canIncr + or + not + canExit + ")");

            case CsCondition.EMPTYorMIDDLE:
                return("(" + empty + or + canIncr + and + canExit + ")");

            default:
                throw new AutomataException(AutomataExceptionKind.UndefinedEnum);
                #endregion
            }
        }