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)); }