public void AddRule() { string pattern = @"(&)|(->)"; string input = Console.ReadLine(); List <Fact> facts = new List <Fact>(); (Regex.Split(input, pattern)).Where(temp => !Regex.IsMatch(temp, pattern)) .ToList().ForEach(factToParse => facts.Add(this.ParseFact(factToParse))); using (var context = new PrologContext()) { Rule rule = new Rule(); facts.ForEach(fact => fact.ArgumentPositions = null); facts.Last().RuleResponse = rule; facts.Take(facts.Count - 1).ToList().ForEach(fact => fact.Rule = rule); context.AttachRange(facts); try { context.SaveChanges(); } catch (System.Exception) { throw; } } }
public void GetFacts() { using (var context = new PrologContext()) { System.Console.WriteLine(context.Facts .Include(fact => fact.ArgumentPositions) .ThenInclude(arg => arg.Argument) .ToList() .Select(fact => fact.ToString()).First()); } }
public void GetRules() { using (var context = new PrologContext()) { var test = context.Facts.Include(fact => fact.Rule); foreach (var item in context.Rules .Include(rule => rule.Response) .ThenInclude(rule => rule.ArgumentPositions) .ThenInclude(arg => arg.Argument) .Include(rule => rule.Facts) .ThenInclude(arg => arg.ArgumentPositions) .ThenInclude(arg => arg.Argument) .ToList() .Select(rule => rule.ToString())) { System.Console.WriteLine(item); } } }
private Fact ParseFact(string s) { using (PrologContext context = new PrologContext()) { string[] splitted = s.Split(this.FactSplitRules); Fact fact = new Fact(); fact.Name = splitted[0]; for (int i = 1; i < splitted.Length; i++) { string name = splitted[i]; if (!string.IsNullOrWhiteSpace(name)) { Argument argument = context.Arguments.FirstOrDefault(arg => arg.Name == name); if (argument == null) { if (!char.IsUpper(name[0])) { argument = new Atom() { Name = name }; } else { argument = new Variable() { Name = name }; } context.Arguments.Add(argument); } context.ArgumentPositions.Add(new ArgumentPosition() { Argument = argument, Fact = fact }); } } context.Facts.Add(fact); context.SaveChanges(); return(fact); } }
public PrologContext prolog() { PrologContext _localctx = new PrologContext(_ctx, State); EnterRule(_localctx, 2, RULE_prolog); int _la; try { EnterOuterAlt(_localctx, 1); { State = 32; Match(XMLDeclOpen); State = 36; _errHandler.Sync(this); _la = _input.La(1); while (_la == Name) { { { State = 33; attribute(); } } State = 38; _errHandler.Sync(this); _la = _input.La(1); } State = 39; Match(SPECIAL_CLOSE); } } catch (RecognitionException re) { _localctx.exception = re; _errHandler.ReportError(this, re); _errHandler.Recover(this, re); } finally { ExitRule(); } return(_localctx); }