Beispiel #1
0
        public static Clause Decompose(String s)
        {
            s = Regex.Replace(s, @"\s+", "");


            List <Literal> list = new List <Literal>();

            int indexOfArrow = s.IndexOf('<');

            if (indexOfArrow != -1)
            {
                list.Add(Literal.Decompose(s.Substring(0, indexOfArrow)));


                s = s.Substring(indexOfArrow + 3);
                // s = "child_of(b, X), hate(Y, X), child_of(f2(f1(X)), f2(f1(X)))"

                Stack <int> OpenBracket  = new Stack <int>();
                Stack <int> CloseBracket = new Stack <int>();

                int startOfCurrentLiteral = 0;
                for (int i = 0; i < s.Length; i++)
                {
                    // Bracket identification
                    if (s[i] == '(')
                    {
                        OpenBracket.Push(i);
                    }
                    else
                    {
                        if (s[i] == ')')
                        {
                            CloseBracket.Push(i);
                        }
                    }

                    if (OpenBracket.Count != 0 && OpenBracket.Count == CloseBracket.Count)
                    {
                        list.Add(Literal.Decompose(s.Substring(startOfCurrentLiteral, CloseBracket.Peek() + 1 - startOfCurrentLiteral)));
                        for (; i < s.Length && s[i] != ','; i++)
                        {
                            ;
                        }

                        // Reset, start processing a new Literal
                        if (i + 1 < s.Length)
                        {
                            startOfCurrentLiteral = i + 1;
                        }
                        OpenBracket.Clear();
                        CloseBracket.Clear();
                    }
                }
            }
            else
            {
                list.Add(Literal.Decompose(s));
            }

            return(new Clause(list));
        }