diff --git a/ModelsTests/ForOtherTeam/AlchemyTest.cs b/ModelsTests/ForOtherTeam/AlchemyTest.cs index eb71425..37ffb69 100644 --- a/ModelsTests/ForOtherTeam/AlchemyTest.cs +++ b/ModelsTests/ForOtherTeam/AlchemyTest.cs @@ -154,7 +154,7 @@ public void NecessaryEngagedFilemonInBrew() Query q = Parser.ParseQuery(Tokenizer.Tokenize(query), _parserState); var result = q.Solve(_parserState.Story); - Assert.False(result); + Assert.True(result); } [Test] @@ -165,7 +165,7 @@ public void NecessaryEngagedBercikInBrew() Query q = Parser.ParseQuery(Tokenizer.Tokenize(query), _parserState); var result = q.Solve(_parserState.Story); - Assert.False(result); + Assert.True(result); } [Test] diff --git a/ModelsTests/ForOtherTeam/ElevatorTest.cs b/ModelsTests/ForOtherTeam/ElevatorTest.cs index 2adb2ef..716484e 100644 --- a/ModelsTests/ForOtherTeam/ElevatorTest.cs +++ b/ModelsTests/ForOtherTeam/ElevatorTest.cs @@ -140,16 +140,15 @@ public void NecessaryEngaged_Serwisant_In_Repair_True() Assert.That(result, Is.True); } - [Test] - public void PossiblyEngaged_Tomek_In_Repair_False() + public void PossiblyEngaged_Tomek_In_Repair_True() { var query = "necessary [tomek] engaged in (repair, [tomek])"; Query q = Parser.ParseQuery(Tokenizer.Tokenize(query), _parserState); var result = q.Solve(_parserState.Story); - Assert.That(result, Is.False); + Assert.True(result); } #endregion diff --git a/ModelsTests/ForOtherTeam/PickUpTest.cs b/ModelsTests/ForOtherTeam/PickUpTest.cs index ab11142..e924d27 100644 --- a/ModelsTests/ForOtherTeam/PickUpTest.cs +++ b/ModelsTests/ForOtherTeam/PickUpTest.cs @@ -145,14 +145,14 @@ public void PossiblyEngaged_Jack_In_PickUp_True() } [Test] - public void NecessaryEngaged_JackAndBob_In_PickUp_False() + public void NecessaryEngaged_JackAndBob_In_PickUp_True() { var query = "necessary [jack, bob] engaged in (pickUp, [jack, bob])"; Query q = Parser.ParseQuery(Tokenizer.Tokenize(query), _parserState); var result = q.Solve(_parserState.Story); - Assert.That(result, Is.False); + Assert.True(result); } #endregion diff --git a/ModelsTests/NecessaryEngegedTest.cs b/ModelsTests/NecessaryEngegedTest.cs index 9be83f5..2320b94 100644 --- a/ModelsTests/NecessaryEngegedTest.cs +++ b/ModelsTests/NecessaryEngegedTest.cs @@ -102,7 +102,7 @@ necessary [g2] engaged in (A1, [g1, g2, g3]),(A2, [g2, g3, g4]) var result = q.Solve(expressions); - Assert.IsFalse(result); + Assert.IsTrue(result); } [Test] @@ -192,5 +192,66 @@ necessary [h] engaged in (buypaper, [g]) Assert.IsFalse(result); } + [Test] + public void Test_BP_withNotBy() + { + string story = @" +Fluent hasA +Fluent hasB +Agent g +Agent h +Action buypaper +buypaper by [g, h] causes [hasA || hasB] +impossible buypaper by [h] +"; + var tokens = Tokenizer.Tokenize(story); + var parserState = Parser.Parse(tokens); + var expressions = parserState.Story; + + string query = @" +necessary [h] engaged in (buypaper, [g, h]) +"; + + Query q = Parser.ParseQuery( + Tokenizer.Tokenize(query), + parserState); + + var result = q.Solve(expressions); + + Assert.IsTrue(result); + } + + [Test] + public void Test_3() + { + string story = @" +Fluent a +Fluent b +Agent g +Agent h +Action A1 +Action A2 + +initially [~b] +A1 by [g, h] releases a if [~b] +A2 by [h] causes [b] if [a] +"; + var tokens = Tokenizer.Tokenize(story); + var parserState = Parser.Parse(tokens); + var expressions = parserState.Story; + + string query = @" +necessary [h] engaged in (A1, [g, h]), (A2, [h]) from [~b && a] +"; + + Query q = Parser.ParseQuery( + Tokenizer.Tokenize(query), + parserState); + + var result = q.Solve(expressions); + + Assert.IsTrue(result); + } + } } diff --git a/ModelsTests/PossiblyEngegedTest.cs b/ModelsTests/PossiblyEngegedTest.cs index a5ce788..ef74f4d 100644 --- a/ModelsTests/PossiblyEngegedTest.cs +++ b/ModelsTests/PossiblyEngegedTest.cs @@ -165,7 +165,6 @@ possibly [h] engaged in (buypaper, [g]) var result = q.Solve(expressions); - // TODO: update docummentation - Arek Assert.IsTrue(result); } @@ -195,7 +194,6 @@ possibly [h] engaged in (buypaper, [g]) var result = q.Solve(expressions); - // TODO: fix - Arek Assert.IsFalse(result); } diff --git a/MultiAgentLanguageModels/Queries/NecessaryEngagedFrom.cs b/MultiAgentLanguageModels/Queries/NecessaryEngagedFrom.cs index f7844cb..cb150b3 100644 --- a/MultiAgentLanguageModels/Queries/NecessaryEngagedFrom.cs +++ b/MultiAgentLanguageModels/Queries/NecessaryEngagedFrom.cs @@ -31,7 +31,7 @@ public override bool Solve(ExpressionsList expressions) //could be done prettier but it's easier to read List resultsForEachInitiallState = new List(); - //for each initial state + //for each initiall state foreach (var initialState in initialStates) { HashSet currentStates = new HashSet(); @@ -51,24 +51,18 @@ public override bool Solve(ExpressionsList expressions) } } } - var necessarilyEngagesAgents = new List(); //now we iterate through instructions for (int i = 0; i < Instructions.Count; i++) { var action = Instructions[i].Item1; var agents = Instructions[i].Item2; - QueriedAgents.ForEach(queriedAgent => - { - if (!agents.Contains(queriedAgent)) agents.Add(queriedAgent); - }); + QueriedAgents.ForEach(queriedAgent => agents.Remove(queriedAgent)); HashSet newCurrentStates = new HashSet(); - var engagesAgentsInEachState = true; //for each state in current states we want to move forward in graph foreach (var currentState in currentStates) { var triple = new Triple(action, currentState, agents); - //if we can find good edge in graph //from currentState, specific action and agents group then if (res.ContainsKey(triple)) @@ -76,41 +70,17 @@ public override bool Solve(ExpressionsList expressions) //add all next states to the newCurrentStates res[triple].ToList().ForEach(s => newCurrentStates.Add(s)); } - - if (!CheckAllActionsEngageAgents(res, triple)) + else { - engagesAgentsInEachState = false; + resultsForEachInitiallState.Add(false); } } - necessarilyEngagesAgents.Add(engagesAgentsInEachState); - // do it again for new action and agents group + //do it again for new action and agents group currentStates = newCurrentStates; } - resultsForEachInitiallState.Add(currentStates.Count != 0 && necessarilyEngagesAgents.Any(x => x)); + resultsForEachInitiallState.Add(currentStates.Count != 0); } - return resultsForEachInitiallState.All(x => x); - } - - private bool CheckAllActionsEngageAgents(Dictionary> res, Triple triple) - { - var action = triple.Item1; - var state = triple.Item2; - var agents = triple.Item3; - var amountOfActions = res.Where(t => - { - var resAction = t.Key.Item1; - var resState = t.Key.Item2; - return resAction.Equals(action) && resState.Equals(state); - }).Count(); - var amountOfActionsExecutedByAnyOfQueriedAgents = res.Where(t => - { - var resAction = t.Key.Item1; - var resState = t.Key.Item2; - var resAgents = t.Key.Item3; - var actionEngagesAnyOfAgents = resAgents.Any(agent => QueriedAgents.Contains(agent)); - return resAction.Equals(action) && resState.Equals(state) && actionEngagesAnyOfAgents; - }).Count(); - return amountOfActionsExecutedByAnyOfQueriedAgents == amountOfActions; + return resultsForEachInitiallState.All(x => !x); } }