예제 #1
0
        public static string NonRegularCheckWord(ArithmeticLanguage lang, int n, string word)
        {
            if (word.Length < n)
            {
                return("<false>Word is too short.</false>");
            }

            foreach (char c in word)
            {
                if (!lang.alphabet.Contains(c + ""))
                {
                    return("<false>Word contains illegal letters.</false>");
                }
            }

            if (lang.symbolic_string.isFlat())
            {
                SymbolicString wordSS = Parser.parseSymbolicString(word, lang.alphabet.ToList());
                if (ProofChecker.checkContainment(wordSS, lang, LogicalExpression.True()))
                {
                    return("<true></true>");
                }
                else
                {
                    return("<false>Word is not in the language.</false>");
                }
            }
            else
            {
                throw new PumpingLemmaException("Arithmetic Language must be flat!");
            }
        }
예제 #2
0
 public static Tuple <string, string, string> NonRegularGetPumpableSplit(ArithmeticLanguage language, string word, int n)
 {
     foreach (var split in possibleSplits(word, n))
     {
         SymbolicString str = splitToSymbStr(language.alphabet.ToList(), split.Item1, split.Item2, split.Item3);
         if (ProofChecker.checkContainment(str, language, LogicalExpression.True()))
         {
             return(split);
         }
     }
     return(null);
 }
예제 #3
0
        public static bool NonRegularCheckI(ArithmeticLanguage language, string start, string mid, string end, int i)
        {
            string fullWord = pumpMid(start, mid, end, i);

            if (language.symbolic_string.isFlat())
            {
                SymbolicString wordSS = Parser.parseSymbolicString(fullWord.ToString(), language.alphabet.ToList());
                return(ProofChecker.checkContainment(wordSS, language, LogicalExpression.True()));
            }
            else
            {
                throw new PumpingLemmaException("Arithmetic Language must be flat!");
            }
        }
예제 #4
0
        public static string NonRegularGetUnpumpableWord(ArithmeticLanguage language, SymbolicString unpumpableWord, int n)
        {
            Dictionary <VariableType, int> assignment = new Dictionary <VariableType, int>();

            assignment.Add(VariableType.Variable("n"), n);
            string         word = pumpedWord(unpumpableWord, assignment);
            SymbolicString ss   = SymbolicString.FromTextDescription(language.alphabet.ToList(), word);

            while (!ProofChecker.checkContainment(ss, language, LogicalExpression.True()))
            {
                assignment[VariableType.Variable("n")]++;
                word = pumpedWord(unpumpableWord, assignment);
                ss   = SymbolicString.FromTextDescription(language.alphabet.ToList(), word);
            }
            return(word);
        }
예제 #5
0
        public static int NonRegularGetI(ArithmeticLanguage language, string start, string mid, string end)
        {
            SymbolicString matchingString = splitToSymbStr(language.alphabet.ToList(), start, mid, end);

            if (ProofChecker.checkContainment(matchingString, language, LogicalExpression.True()))
            {
                return(1); // AI surrenders
            }
            else
            {
                int i = 0;
                do
                {
                    string         word = pumpMid(start, mid, end, i);
                    SymbolicString ss   = SymbolicString.FromTextDescription(language.alphabet.ToList(), word);
                    if (!ProofChecker.checkContainment(ss, language, LogicalExpression.True()))
                    {
                        return(i);
                    }
                    i++;
                } while (i < 99); //for debugging purposes
                return(-1);
            }
        }