Exemple #1
0
        private HashSet <State> GetResN(HashSet <State> resZeroPlus, Action action, Actor actor, State from)
        {
            HashSet <State> resN = new HashSet <State>();

            int minNewSize = int.MaxValue;

            foreach (var to in resZeroPlus)
            {
                var newSet = GetNew(action, actor, from, to);

                if (newSet.Count > minNewSize)
                {
                    continue;
                }
                else if (newSet.Count == minNewSize)
                {
                    resN.Add(to);
                }
                else
                {
                    resN.Clear();
                    minNewSize = newSet.Count;
                    resN.Add(to);
                }
            }
            return(resN);
        }
Exemple #2
0
        public ISet <State> GetStates(Action action, Actor actor, State from, bool abnormal)
        {
            int keyHash = new { action, actor, from }.GetHashCode();

            if (abnormal && _resAbCache.ContainsKey(keyHash))
            {
                return(_resAbCache[keyHash]);
            }
            if (!abnormal && _resNCache.ContainsKey(keyHash))
            {
                return(_resNCache[keyHash]);
            }

            // Calculating Res sets for every method invocation is expensive. Not sure if there's better way tho.

            var resZero     = GetResZero(_states, action, actor, from);
            var resMinus    = GetResMinus(resZero, action, actor, from);
            var resZeroPlus = GetResZeroPlus(resZero, action, actor, from);
            var resN        = GetResN(resZeroPlus, action, actor, from);
            var resAb       = GetResAb(resMinus, resN); // Calculating ResAb is cheap when ResN is given.

            _resNCache.Add(keyHash, resN);
            _resAbCache.Add(keyHash, resAb);

            return(abnormal ? resAb : resN);
        }
Exemple #3
0
        private HashSet <State> GetResZeroPlus(HashSet <State> resZero, Action action, Actor actor, State from)
        {
            HashSet <State> resZeroPlus = new HashSet <State>(resZero);

            foreach (var tCausesClause in _domain.TypicallyCausesClauses)
            {
                if (tCausesClause.Action != action)
                {
                    continue;
                }
                if (!tCausesClause.Exclusion && !tCausesClause.Actors.Contains(actor))
                {
                    continue;
                }
                if (tCausesClause.Exclusion && !_actors.Except(tCausesClause.Actors).Contains(actor))
                {
                    continue;
                }
                if (!tCausesClause.Condition.Check(from))
                {
                    continue;
                }

                resZeroPlus.RemoveWhere(s => !tCausesClause.Effect.Check(s));
            }

            return(resZeroPlus);
        }
Exemple #4
0
        private HashSet <Fluent> GetNew(Action action, Actor actor, State from, State to)
        {
            HashSet <Fluent> newSet = new HashSet <Fluent>();

            foreach (var fluent in _fluents)
            {
                if (from[fluent] != to[fluent])
                {
                    newSet.Add(fluent);
                }
            }

            foreach (var releaseClause in _domain.ReleasesClauses)
            {
                if (releaseClause.Action != action)
                {
                    continue;
                }
                if (!releaseClause.Exclusion && !releaseClause.Actors.Contains(actor))
                {
                    continue;
                }
                if (releaseClause.Exclusion && !_actors.Except(releaseClause.Actors).Contains(actor))
                {
                    continue;
                }
                if (!releaseClause.Condition.Check(from))
                {
                    continue;
                }

                newSet.Add(releaseClause.Fluent);
            }

            return(newSet);
        }
Exemple #5
0
        private HashSet <State> GetResZero(List <State> validStates, Action action, Actor actor, State from)
        {
            HashSet <State> resZero = new HashSet <State>(validStates);

            foreach (var impossibleClause in _domain.ImpossibleClauses)
            {
                if (impossibleClause.Action != action)
                {
                    continue;
                }
                if (!impossibleClause.Exclusion && !impossibleClause.Actors.Contains(actor))
                {
                    continue;
                }
                if (impossibleClause.Exclusion && !_actors.Except(impossibleClause.Actors).Contains(actor))
                {
                    continue;
                }
                if (!impossibleClause.Condition.Check(from))
                {
                    continue;
                }

                resZero.Clear();
                return(resZero);
            }

            foreach (var causesClause in _domain.CausesClauses)
            {
                if (causesClause.Action != action)
                {
                    continue;
                }
                if (!causesClause.Exclusion && !causesClause.Actors.Contains(actor))
                {
                    continue;
                }
                if (causesClause.Exclusion && !_actors.Except(causesClause.Actors).Contains(actor))
                {
                    continue;
                }
                if (!causesClause.Condition.Check(from))
                {
                    continue;
                }

                resZero.RemoveWhere(s => !causesClause.Effect.Check(s));
            }

            foreach (var preservesClause in _domain.PreservesClauses)
            {
                if (preservesClause.Action != action)
                {
                    continue;
                }
                if (!preservesClause.Exclusion && !preservesClause.Actors.Contains(actor))
                {
                    continue;
                }
                if (preservesClause.Exclusion && !_actors.Except(preservesClause.Actors).Contains(actor))
                {
                    continue;
                }
                if (!preservesClause.Condition.Check(from))
                {
                    continue;
                }

                var fluent = preservesClause.Fluent;
                resZero.RemoveWhere(s => s[fluent] != from[fluent]);
            }

            return(resZero);
        }
Exemple #6
0
        public void OnlyAtypical()
        {
            World world = World.Instance;

            var aAction     = new Action("A");
            var nonameActor = new Actor("Noname");
            var pFluent     = new Fluent("p");
            var qFluent     = new Fluent("q");
            var fluentList  = new List <Fluent> {
                pFluent, qFluent
            };

            var domain = new Domain();

            domain.AddInitiallyClause(new Initially(new Conjunction(pFluent, qFluent)));
            domain.AddAlwaysClause(new Always(new Alternative(pFluent, qFluent)));
            domain.AddCausesClause(new Causes(aAction, false, new List <Actor> {
                nonameActor
            }, new Negation(pFluent)));
            domain.AddTypicallyCausesClause(new TypicallyCauses(aAction, false, new List <Actor> {
                nonameActor
            }, new Negation(qFluent), pFluent));

            world.SetActions(new List <Action> {
                aAction
            });
            world.SetActors(new List <Actor> {
                nonameActor
            });
            world.SetFluents(fluentList);
            world.SetDomain(domain);

            Assert.IsTrue(world.Build());

            State state0 = new State(fluentList, new List <bool> {
                true, true
            });
            State state1 = new State(fluentList, new List <bool> {
                true, false
            });
            State state2 = new State(fluentList, new List <bool> {
                false, true
            });

            ISet <State> expectedResN, expectedResAb, actualResN, actualResAb;

            // A; Noname; p & q
            expectedResN  = new HashSet <State> {
            };
            expectedResAb = new HashSet <State> {
                state2
            };
            actualResN  = world.GetStates(aAction, nonameActor, state0, false);
            actualResAb = world.GetStates(aAction, nonameActor, state0, true);
            AssertResSetsEqual(expectedResN, actualResN);
            AssertResSetsEqual(expectedResAb, actualResAb);

            // A; Noname; p & -q
            expectedResN  = new HashSet <State> {
            };
            expectedResAb = new HashSet <State> {
                state2
            };
            actualResN  = world.GetStates(aAction, nonameActor, state1, false);
            actualResAb = world.GetStates(aAction, nonameActor, state1, true);
            AssertResSetsEqual(expectedResN, actualResN);
            AssertResSetsEqual(expectedResAb, actualResAb);

            // A; Noname; -p & q
            expectedResN = new HashSet <State> {
                state2
            };
            expectedResAb = new HashSet <State> {
            };
            actualResN    = world.GetStates(aAction, nonameActor, state2, false);
            actualResAb   = world.GetStates(aAction, nonameActor, state2, true);
            AssertResSetsEqual(expectedResN, actualResN);
            AssertResSetsEqual(expectedResAb, actualResAb);
        }
Exemple #7
0
        public void CookingJohn()
        {
            World world = World.Instance;

            var cookAction    = new Action("Cook");
            var eatAction     = new Action("Eat");
            var johnActor     = new Actor("John");
            var hungryFluent  = new Fluent("hungry");
            var hasMealFluent = new Fluent("hasMeal");
            var fluentList    = new List <Fluent> {
                hungryFluent, hasMealFluent
            };

            var domain = new Domain();

            domain.AddInitiallyClause(new Initially(new Conjunction(hungryFluent, new Negation(hasMealFluent))));
            domain.AddImpossibleClause(new Impossible(eatAction, false, new List <Actor> {
                johnActor
            }, new Negation(hasMealFluent)));
            domain.AddTypicallyCausesClause(new TypicallyCauses(cookAction, false, new List <Actor> {
                johnActor
            }, hasMealFluent));
            domain.AddCausesClause(new Causes(eatAction, false, new List <Actor> {
                johnActor
            }, new Negation(hasMealFluent)));
            domain.AddReleasesClause(new Releases(eatAction, false, new List <Actor> {
                johnActor
            }, hungryFluent, hungryFluent));

            world.SetActors(new List <Actor> {
                johnActor
            });
            world.SetActions(new List <Action> {
                cookAction, eatAction
            });
            world.SetFluents(fluentList);
            world.SetDomain(domain);

            Assert.IsTrue(world.Build());

            State state0 = new State(fluentList, new List <bool> {
                true, false
            });
            State state1 = new State(fluentList, new List <bool> {
                true, true
            });
            State state2 = new State(fluentList, new List <bool> {
                false, true
            });
            State state3 = new State(fluentList, new List <bool> {
                false, false
            });

            ISet <State> expectedResN, expectedResAb, actualResN, actualResAb;

            // cook; john; hungry & -hasMeal
            expectedResN = new HashSet <State> {
                state1
            };
            expectedResAb = new HashSet <State> {
                state0
            };
            actualResN  = world.GetStates(cookAction, johnActor, state0, false);
            actualResAb = world.GetStates(cookAction, johnActor, state0, true);
            AssertResSetsEqual(expectedResN, actualResN);
            AssertResSetsEqual(expectedResAb, actualResAb);

            // cook; john; hungry & hasMeal
            expectedResN = new HashSet <State> {
                state1
            };
            expectedResAb = new HashSet <State> {
            };
            actualResN    = world.GetStates(cookAction, johnActor, state1, false);
            actualResAb   = world.GetStates(cookAction, johnActor, state1, true);
            AssertResSetsEqual(expectedResN, actualResN);
            AssertResSetsEqual(expectedResAb, actualResAb);

            // cook; john; -hungry & hasMeal
            expectedResN = new HashSet <State> {
                state2
            };
            expectedResAb = new HashSet <State> {
            };
            actualResN    = world.GetStates(cookAction, johnActor, state2, false);
            actualResAb   = world.GetStates(cookAction, johnActor, state2, true);
            AssertResSetsEqual(expectedResN, actualResN);
            AssertResSetsEqual(expectedResAb, actualResAb);

            // cook; john; -hungry & -hasMeal
            expectedResN = new HashSet <State> {
                state2
            };
            expectedResAb = new HashSet <State> {
                state3
            };
            actualResN  = world.GetStates(cookAction, johnActor, state3, false);
            actualResAb = world.GetStates(cookAction, johnActor, state3, true);
            AssertResSetsEqual(expectedResN, actualResN);
            AssertResSetsEqual(expectedResAb, actualResAb);

            // eat; john; hungry & -hasMeal
            expectedResN  = new HashSet <State> {
            };
            expectedResAb = new HashSet <State> {
            };
            actualResN    = world.GetStates(eatAction, johnActor, state0, false);
            actualResAb   = world.GetStates(eatAction, johnActor, state0, true);
            AssertResSetsEqual(expectedResN, actualResN);
            AssertResSetsEqual(expectedResAb, actualResAb);

            // eat; john; hungry & hasMeal
            expectedResN = new HashSet <State> {
                state0, state3
            };
            expectedResAb = new HashSet <State> {
            };
            actualResN    = world.GetStates(eatAction, johnActor, state1, false);
            actualResAb   = world.GetStates(eatAction, johnActor, state1, true);
            AssertResSetsEqual(expectedResN, actualResN);
            AssertResSetsEqual(expectedResAb, actualResAb);

            // eat; john; -hungry & hasMeal
            expectedResN = new HashSet <State> {
                state3
            };
            expectedResAb = new HashSet <State> {
            };
            actualResN    = world.GetStates(eatAction, johnActor, state2, false);
            actualResAb   = world.GetStates(eatAction, johnActor, state2, true);
            AssertResSetsEqual(expectedResN, actualResN);
            AssertResSetsEqual(expectedResAb, actualResAb);

            // eat; john; -hungry & -hasMeal
            expectedResN  = new HashSet <State> {
            };
            expectedResAb = new HashSet <State> {
            };
            actualResN    = world.GetStates(eatAction, johnActor, state3, false);
            actualResAb   = world.GetStates(eatAction, johnActor, state3, true);
            AssertResSetsEqual(expectedResN, actualResN);
            AssertResSetsEqual(expectedResAb, actualResAb);
        }
Exemple #8
0
        public void Blowfish()
        {
            World world = World.Instance;

            var inflateAction  = new Action("Inflate");
            var deflateAction  = new Action("Deflate");
            var blowfishActor  = new Actor("Blowfish");
            var puffedUpFluent = new Fluent("puffedUp");
            var fluentList     = new List <Fluent> {
                puffedUpFluent
            };

            var domain = new Domain();

            domain.AddInitiallyClause(new Initially(puffedUpFluent));
            domain.AddCausesClause(new Causes(inflateAction, false, new List <Actor> {
                blowfishActor
            }, puffedUpFluent));
            domain.AddCausesClause(new Causes(deflateAction, false, new List <Actor> {
                blowfishActor
            }, new Negation(puffedUpFluent)));

            world.SetActions(new List <Action> {
                inflateAction, deflateAction
            });
            world.SetActors(new List <Actor> {
                blowfishActor
            });
            world.SetFluents(fluentList);
            world.SetDomain(domain);

            Assert.IsTrue(world.Build());

            State state0 = new State(fluentList, new List <bool> {
                true
            });
            State state1 = new State(fluentList, new List <bool> {
                false
            });

            ISet <State> expectedResN, expectedResAb, actualResN, actualResAb;

            // inflate; blowfish; puffedUp
            expectedResN = new HashSet <State> {
                state0
            };
            expectedResAb = new HashSet <State> {
            };
            actualResN    = world.GetStates(inflateAction, blowfishActor, state0, false);
            actualResAb   = world.GetStates(inflateAction, blowfishActor, state0, true);
            AssertResSetsEqual(expectedResN, actualResN);
            AssertResSetsEqual(expectedResAb, actualResAb);

            // inflate; blowfish; -puffedUp
            expectedResN = new HashSet <State> {
                state0
            };
            expectedResAb = new HashSet <State> {
            };
            actualResN    = world.GetStates(inflateAction, blowfishActor, state1, false);
            actualResAb   = world.GetStates(inflateAction, blowfishActor, state1, true);
            AssertResSetsEqual(expectedResN, actualResN);
            AssertResSetsEqual(expectedResAb, actualResAb);

            // deflate; blowfish; puffedUp
            expectedResN = new HashSet <State> {
                state1
            };
            expectedResAb = new HashSet <State> {
            };
            actualResN    = world.GetStates(deflateAction, blowfishActor, state0, false);
            actualResAb   = world.GetStates(deflateAction, blowfishActor, state0, true);
            AssertResSetsEqual(expectedResN, actualResN);
            AssertResSetsEqual(expectedResAb, actualResAb);

            // deflate; blowfish; -puffedUp
            expectedResN = new HashSet <State> {
                state1
            };
            expectedResAb = new HashSet <State> {
            };
            actualResN    = world.GetStates(deflateAction, blowfishActor, state1, false);
            actualResAb   = world.GetStates(deflateAction, blowfishActor, state1, true);
            AssertResSetsEqual(expectedResN, actualResN);
            AssertResSetsEqual(expectedResAb, actualResAb);
        }
Exemple #9
0
        public void Alice()
        {
            World world = World.Instance;

            var hatterActor        = new Actor("Hatter");
            var drinkAction        = new Action("Drink");
            var eatAction          = new Action("Eat");
            var hatterMadFluent    = new Fluent("hatterMad");
            var cakeExistsFluent   = new Fluent("cakeExists");
            var elixirExistsFluent = new Fluent("elixirExists");
            var fluentList         = new List <Fluent> {
                hatterMadFluent, cakeExistsFluent, elixirExistsFluent
            };

            var domain     = new Domain();
            var initially1 = new Initially(new Conjunction(new Negation(hatterMadFluent), cakeExistsFluent, elixirExistsFluent));
            var causes1    = new Causes(drinkAction, false, new List <Actor> {
                hatterActor
            }, hatterMadFluent, elixirExistsFluent);
            var causes2 = new Causes(eatAction, false, new List <Actor> {
                hatterActor
            }, new Negation(cakeExistsFluent));
            var tCauses1 = new TypicallyCauses(eatAction, false, new List <Actor> {
                hatterActor
            }, new Negation(hatterMadFluent), hatterMadFluent);
            var impossible1 = new Impossible(eatAction, false, new List <Actor> {
                hatterActor
            }, new Negation(cakeExistsFluent));
            var releases1 = new Releases(drinkAction, false, new List <Actor> {
                hatterActor
            }, elixirExistsFluent, elixirExistsFluent);

            domain.AddInitiallyClause(initially1);
            domain.AddCausesClause(causes1);
            domain.AddTypicallyCausesClause(tCauses1);
            domain.AddImpossibleClause(impossible1);
            domain.AddReleasesClause(releases1);
            domain.AddCausesClause(causes2);

            world.SetActions(new List <Action> {
                drinkAction, eatAction
            });
            world.SetActors(new List <Actor> {
                hatterActor
            });
            world.SetFluents(fluentList);
            world.SetDomain(domain);

            Assert.IsTrue(world.Build());

            State state0 = new State(fluentList, new List <bool> {
                false, true, true
            });
            State state1 = new State(fluentList, new List <bool> {
                true, true, true
            });
            State state2 = new State(fluentList, new List <bool> {
                true, false, true
            });
            State state3 = new State(fluentList, new List <bool> {
                false, false, true
            });
            State state4 = new State(fluentList, new List <bool> {
                true, false, false
            });
            State state5 = new State(fluentList, new List <bool> {
                true, true, false
            });
            State state6 = new State(fluentList, new List <bool> {
                false, true, false
            });
            State state7 = new State(fluentList, new List <bool> {
                false, false, false
            });

            ISet <State> expectedResN, expectedResAb, actualResN, actualResAb;

            // drink; hatter; -hatterMad & cakeExists & elixirExists
            expectedResN = new HashSet <State> {
                state1, state5
            };
            expectedResAb = new HashSet <State> {
            };
            actualResN    = world.GetStates(drinkAction, hatterActor, state0, false);
            actualResAb   = world.GetStates(drinkAction, hatterActor, state0, true);
            AssertResSetsEqual(expectedResN, actualResN);
            AssertResSetsEqual(expectedResAb, actualResAb);

            // drink; hatter; hatterMad & cakeExists & elixirExists
            expectedResN = new HashSet <State> {
                state1, state5
            };
            expectedResAb = new HashSet <State> {
            };
            actualResN    = world.GetStates(drinkAction, hatterActor, state1, false);
            actualResAb   = world.GetStates(drinkAction, hatterActor, state1, true);
            AssertResSetsEqual(expectedResN, actualResN);
            AssertResSetsEqual(expectedResAb, actualResAb);

            // drink; hatter; hatterMad & -cakeExists & elixirExists
            expectedResN = new HashSet <State> {
                state2, state4
            };
            expectedResAb = new HashSet <State> {
            };
            actualResN    = world.GetStates(drinkAction, hatterActor, state2, false);
            actualResAb   = world.GetStates(drinkAction, hatterActor, state2, true);
            AssertResSetsEqual(expectedResN, actualResN);
            AssertResSetsEqual(expectedResAb, actualResAb);

            // drink; hatter; -hatterMad & -cakeExists & elixirExists
            expectedResN = new HashSet <State> {
                state2, state4
            };
            expectedResAb = new HashSet <State> {
            };
            actualResN    = world.GetStates(drinkAction, hatterActor, state3, false);
            actualResAb   = world.GetStates(drinkAction, hatterActor, state3, true);
            AssertResSetsEqual(expectedResN, actualResN);
            AssertResSetsEqual(expectedResAb, actualResAb);

            // drink; hatter; hatterMad & -cakeExists & -elixirExists
            expectedResN = new HashSet <State> {
                state4
            };
            expectedResAb = new HashSet <State> {
            };
            actualResN    = world.GetStates(drinkAction, hatterActor, state4, false);
            actualResAb   = world.GetStates(drinkAction, hatterActor, state4, true);
            AssertResSetsEqual(expectedResN, actualResN);
            AssertResSetsEqual(expectedResAb, actualResAb);

            // drink; hatter; hatterMad & cakeExists & -elixirExists
            expectedResN = new HashSet <State> {
                state5
            };
            expectedResAb = new HashSet <State> {
            };
            actualResN    = world.GetStates(drinkAction, hatterActor, state5, false);
            actualResAb   = world.GetStates(drinkAction, hatterActor, state5, true);
            AssertResSetsEqual(expectedResN, actualResN);
            AssertResSetsEqual(expectedResAb, actualResAb);

            // drink; hatter; -hatterMad & cakeExists & -elixirExists
            expectedResN = new HashSet <State> {
                state6
            };
            expectedResAb = new HashSet <State> {
            };
            actualResN    = world.GetStates(drinkAction, hatterActor, state6, false);
            actualResAb   = world.GetStates(drinkAction, hatterActor, state6, true);
            AssertResSetsEqual(expectedResN, actualResN);
            AssertResSetsEqual(expectedResAb, actualResAb);

            // drink; hatter; -hatterMad & -cakeExists & -elixirExists
            expectedResN = new HashSet <State> {
                state7
            };
            expectedResAb = new HashSet <State> {
            };
            actualResN    = world.GetStates(drinkAction, hatterActor, state7, false);
            actualResAb   = world.GetStates(drinkAction, hatterActor, state7, true);
            AssertResSetsEqual(expectedResN, actualResN);
            AssertResSetsEqual(expectedResAb, actualResAb);

            // eat; hatter; -hatterMad & cakeExists & elixirExists
            expectedResN = new HashSet <State> {
                state3
            };
            expectedResAb = new HashSet <State> {
            };
            actualResN    = world.GetStates(eatAction, hatterActor, state0, false);
            actualResAb   = world.GetStates(eatAction, hatterActor, state0, true);
            AssertResSetsEqual(expectedResN, actualResN);
            AssertResSetsEqual(expectedResAb, actualResAb);

            // eat; hatter; hatterMad & cakeExists & elixirExists
            expectedResN = new HashSet <State> {
                state3
            };
            expectedResAb = new HashSet <State> {
                state2
            };
            actualResN  = world.GetStates(eatAction, hatterActor, state1, false);
            actualResAb = world.GetStates(eatAction, hatterActor, state1, true);
            AssertResSetsEqual(expectedResN, actualResN);
            AssertResSetsEqual(expectedResAb, actualResAb);

            // eat; hatter; hatterMad & -cakeExists & elixirExists
            expectedResN  = new HashSet <State> {
            };
            expectedResAb = new HashSet <State> {
            };
            actualResN    = world.GetStates(eatAction, hatterActor, state2, false);
            actualResAb   = world.GetStates(eatAction, hatterActor, state2, true);
            AssertResSetsEqual(expectedResN, actualResN);
            AssertResSetsEqual(expectedResAb, actualResAb);

            // eat; hatter; -hatterMad & -cakeExists & elixirExists
            expectedResN  = new HashSet <State> {
            };
            expectedResAb = new HashSet <State> {
            };
            actualResN    = world.GetStates(eatAction, hatterActor, state3, false);
            actualResAb   = world.GetStates(eatAction, hatterActor, state3, true);
            AssertResSetsEqual(expectedResN, actualResN);
            AssertResSetsEqual(expectedResAb, actualResAb);

            // eat; hatter; hatterMad & -cakeExists & -elixirExists
            expectedResN  = new HashSet <State> {
            };
            expectedResAb = new HashSet <State> {
            };
            actualResN    = world.GetStates(eatAction, hatterActor, state4, false);
            actualResAb   = world.GetStates(eatAction, hatterActor, state4, true);
            AssertResSetsEqual(expectedResN, actualResN);
            AssertResSetsEqual(expectedResAb, actualResAb);

            // eat; hatter; hatterMad & cakeExists & -elixirExists
            expectedResN = new HashSet <State> {
                state7
            };
            expectedResAb = new HashSet <State> {
                state4
            };
            actualResN  = world.GetStates(eatAction, hatterActor, state5, false);
            actualResAb = world.GetStates(eatAction, hatterActor, state5, true);
            AssertResSetsEqual(expectedResN, actualResN);
            AssertResSetsEqual(expectedResAb, actualResAb);

            // eat; hatter; -hatterMad & cakeExists & -elixirExists
            expectedResN = new HashSet <State> {
                state7
            };
            expectedResAb = new HashSet <State> {
            };
            actualResN    = world.GetStates(eatAction, hatterActor, state6, false);
            actualResAb   = world.GetStates(eatAction, hatterActor, state6, true);
            AssertResSetsEqual(expectedResN, actualResN);
            AssertResSetsEqual(expectedResAb, actualResAb);

            // eat; hatter; -hatterMad & -cakeExists & -elixirExists
            expectedResN  = new HashSet <State> {
            };
            expectedResAb = new HashSet <State> {
            };
            actualResN    = world.GetStates(eatAction, hatterActor, state7, false);
            actualResAb   = world.GetStates(eatAction, hatterActor, state7, true);
            AssertResSetsEqual(expectedResN, actualResN);
            AssertResSetsEqual(expectedResAb, actualResAb);
        }