internal static void ModuleTesting() { var externalDatabase = RestaurantAgent.CreateRestaurantDatabase(); var module = new ExternalDatabaseProviderModule("restaurant", externalDatabase); var database = new EvaluatedDatabase(); database.Container .Pattern("luxury") .WhatItSpecifies("pricerange") .HowToEvaluate("expensive") ; database.StartQueryLog(); module.AttachTo(database); var result = database.Query(SemanticItem.AnswerQuery(Question.HowToDo, Constraints.WithInput("set restaurant specifier luxury"))); //var result = database.Query(SemanticItem.AnswerQuery(Question.IsItTrue, Constraints.WithInput("restaurant database has 1 result"))); var actionId = result.FirstOrDefault().Answer; var action = database.GetNativeAction(actionId); action(result.FirstOrDefault()); var log = database.FinishLog(); Log.Questions(log.GetQuestions()); Log.Result(result); Log.Dump(database); }
internal DataContainer Add(string[] patterns, string question, string answer) { foreach (var pattern in patterns) { Add(SemanticItem.From(question, answer, Constraints.WithInput(pattern))); } return(this); }
internal SemanticItem ChooseOption(string question, IEnumerable <string> columns) { if (columns.Contains(_inputValue)) { return(SemanticItem.Entity(_inputValue)); } //TODO many strategies can be here var result = EvaluationContext.Query(SemanticItem.AnswerQuery(question, Constraints.WithInput(_inputValue))); return(result.FirstOrDefault()); }
private bool executeCommand(SemanticItem command) { var priorQuestions = Db.CurrentLogRoot.GetQuestions(); var commandQuery = SemanticItem.AnswerQuery(Question.HowToDo, Constraints.WithInput(command)); var commandInterpretations = Db.SpanQuery(commandQuery).ToArray(); foreach (var interpretation in commandInterpretations) { if (executeCall(interpretation)) { //we found a way how to execute the command return(true); } } var postQuestions = Db.CurrentLogRoot.GetQuestions(); var executionQuestions = postQuestions.Except(priorQuestions).ToArray(); _executionQuestions.AddRange(executionQuestions); return(false); }
internal Body() { Db.Container .Pattern("print $something") .HowToDo("Print", Db.Container.EvaluateCallArgsSpan("Print", _print, "$something")) .Pattern("$something is a command") .IsTrue("$something has how to do question specified") .Pattern("the $something") .HowToEvaluate("The", _the) .Pattern("one") .HowToConvertToNumber("1") .Pattern("user input") .HowToEvaluate("UserInput", _userInput) .Pattern("history contains $something") .IsTrue("HistoryContains", _historyContains) .Pattern("write $value into $slot slot") .HowToDo("WriteSlot", Db.Container.EvaluateCallArgsSpan("WriteSlot", _writeSlot, "$value", "$slot")) .Pattern("$slot slot is filled") .IsTrue("IsSlotFilled", _isSlotFilled) .Pattern("use $replacement instead of $pattern in output") .HowToDo("OutputChanger", _outputChanger) .Pattern("$something can be an answer") .IsTrue("CanBeAnswer", e => { var result = e.Query("$something", Question.CanItBeAnswer).FirstOrDefault(); var canBeAnswer = result == null || result.Answer == Database.YesAnswer; return(canBeAnswer ? SemanticItem.Yes : SemanticItem.No); }) .Pattern("execute $something") .HowToDo("Execute", e => { var something = e.EvaluateOne("$something"); return(something); }) .Pattern("~ $something") .IsTrue("Not", _notCond) .Pattern("$value1 or $value2") .IsTrue("Or", _orCond) .Pattern("$action1 and $action2") .HowToDo("And", _and) .Pattern("$value1 and $value2") .IsTrue("And", _andCond) .Pattern("$something has $question question specified") .IsTrue("IsQuestionSpecified", e => { var something = e.EvaluateOne("$something"); var question = e.GetSubstitutionValue("$question"); var normalizedQuestion = question + " $@ ?"; var queryItem = SemanticItem.AnswerQuery(normalizedQuestion, Constraints.WithInput(something.Answer)); var result = Db.Query(queryItem); var answer = result.Any() ? Database.YesAnswer : Database.NoAnswer; return(SemanticItem.Entity(answer)); }) .Pattern("add $action to trigger $trigger") .HowToDo("TriggerAdd", _triggerAdd) .Pattern("fire event $event") .HowToDo("FireEvent", _fireEvent) .Pattern("$something joined with $something2") .HowToEvaluate("JoinPhrases", _joinPhrases) .Pattern("dump database") .HowToDo("DumpDatabase", c => { Log.Dump(Db); Print("ok"); return(true); }) ; _commandControl = new CommandControlModule(this); _adviceModule = new AdviceModule(this); AddModule(_commandControl); AddModule(_adviceModule); }
internal SemanticItem GetAnswer(string question, string input) { var query = SemanticItem.AnswerQuery(question, Constraints.WithInput(input)); return(EvaluationContext.Query(query).LastOrDefault()); }