예제 #1
0
        public void StructCharacterGeneratorTest()
        {
            var prog          = new Problem("Struct character generator");
            var characterType = new Struct("Character",
                                           new [] {
                new Member("race", null, "human", "electroid", "insectoid"),
                new Member("class", null, "fighter", "magic user", "cleric", "thief"),
                new Member("nationality", "race=human", "landia", "placeville", "cityburgh"),
                new Member("religion", "class=cleric", "monotheist", "pantheist", "lovecraftian", "dawkinsian")
            },
                                           (p, v) =>
            {
                // Electroids are atheists
                p.Inconsistent(v["race"] == "electroid", v["class"] == "cleric");
                // Lovecraftianism is outlawed in Landia
                p.Inconsistent(v["nationality"] == "landia", v["religion"] == "lovecraftian");
                // Insectoids believe in strict hierarchies
                p.Inconsistent(v["race"] == "insectoid", v["religion"] == "pantheist");
                // Lovecraftianism is the state religion of cityburgh
                p.Inconsistent(v["nationality"] == "cityburgh", v["class"] == "cleric", v["religion"] != "lovecraftian");
            });

            prog.Instantiate("character", characterType);
            for (int i = 0; i < 100; i++)
            {
                Console.WriteLine(prog.Solve().Model);
            }
        }
예제 #2
0
        public void CompileStructCharacterGeneratorTest()
        {
            var d    = new CompiledStructType(typeof(Character));
            var prog = new Problem("compiled struct character generator");

            prog.Instantiate("character", d);
            for (int i = 0; i < 100; i++)
            {
                Console.WriteLine(prog.Solve().Model);
            }
        }
예제 #3
0
        public void CompileStructPartyGeneratorTest()
        {
            var d     = new CompiledStructType(typeof(Character));
            var prog  = new Problem("compiled struct party generator");
            var party = new[] { "fred", "jenny", "sally" };

            // Make one for each party member
            var partyVars = party.Select(c => (Character)prog.Instantiate(c, d)).ToArray();

            // All the classes have to be different
            prog.AllDifferent(partyVars.Select(c => c.Class));

            for (int i = 0; i < 100; i++)
            {
                Console.WriteLine(prog.Solve().Model);
            }
        }
예제 #4
0
        public void StructPartyGeneratorTest()
        {
            var prog  = new Problem("Struct character generator");
            var party = new[] { "fred", "jenny", "sally" };

            var characterType = new Struct("Character",
                                           // Members
                                           new[] {
                new Member("race", null, "human", "electroid", "insectoid"),
                new Member("class", null, "fighter", "magic user", "cleric", "thief"),
                new Member("nationality", "race=human", "landia", "placeville", "cityburgh"),
                new Member("religion", "class=cleric", "monotheist", "pantheist", "lovecraftian", "dawkinsian")
            },
                                           // Constraint
                                           (p, v) =>
            {
                // Electroids are atheists
                p.Inconsistent(v["race"] == "electroid", v["class"] == "cleric");
                // Lovecraftianism is outlawed in Landia
                p.Inconsistent(v["nationality"] == "landia", v["religion"] == "lovecraftian");
                // Insectoids believe in strict hierarchies
                p.Inconsistent(v["race"] == "insectoid", v["religion"] == "pantheist");
                // Lovecraftianism is the state religion of cityburgh
                p.Inconsistent(v["nationality"] == "cityburgh", v["class"] == "cleric", v["religion"] != "lovecraftian");
            });

            // Make one for each party member
            var castVars = party.Select(c => (StructVar)prog.Instantiate(c, characterType)).ToArray();

            // All the classes have to be different
            prog.AllDifferent(castVars.Select(c => (FDVariable <string>)c["class"]));
            for (int i = 0; i < 100; i++)
            {
                Console.WriteLine(prog.Solve().Model);
            }
        }