public static RouteFindingKnowledgeBase Parse(string data)
        {
            var kb = new RouteFindingKnowledgeBase
                {
                    Actions = new List<AbstractAction>(),
                    States = new List<AbstractState>()
                };

            var split = data.Split('\n');
            split = split.Select(s => s.Trim()).ToArray();
            foreach (var entry in split)
            {
                // skip blank lines
                if (String.IsNullOrEmpty(entry)) continue;

                var entrySplit = entry.Split(' ');
                entrySplit = entrySplit.Select(s => s.Trim()).ToArray();

                var sx = int.Parse(entrySplit[0]);
                var sy = int.Parse(entrySplit[1]);
                var ex = int.Parse(entrySplit[3]);
                var ey = int.Parse(entrySplit[4]);
                var actionName = entrySplit[2];

                var startState = kb.GetOrCreateState(sx, sy);
                var endState = kb.GetOrCreateState(ex, ey);

                var action = new RouteFindingAction(actionName, startState, endState);
                kb.Actions.Add(action);
            }

            return kb;
        }