/// <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); }
/// <summary> /// Produces 'q' with subscript i /// </summary> public static string q(int i) { return("q" + SpecialCharacters.ToSubscript(i)); }
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 } }