예제 #1
0
        public void Test_while()
        {
            CorePackage.Entity.Function whileTester = new CorePackage.Entity.Function();
            CorePackage.Entity.Variable i           = new CorePackage.Entity.Variable(CorePackage.Entity.Type.Scalar.Integer, 0);

            //while(i != 10)
            CorePackage.Execution.While loop = new CorePackage.Execution.While();

            CorePackage.Execution.Operators.Different whcondition = new CorePackage.Execution.Operators.Different(CorePackage.Entity.Type.Scalar.Integer, CorePackage.Entity.Type.Scalar.Integer);

            whcondition.GetInput("LeftOperand").LinkTo(new CorePackage.Execution.Getter(i), "reference");
            whcondition.SetInputValue("RightOperand", 10);

            loop.GetInput("condition").LinkTo(whcondition, "result");

            //  i = i + 1;
            CorePackage.Execution.Setter ipp = new CorePackage.Execution.Setter(i);

            CorePackage.Execution.Operators.Add ipone = new CorePackage.Execution.Operators.Add(CorePackage.Entity.Type.Scalar.Integer, CorePackage.Entity.Type.Scalar.Integer, CorePackage.Entity.Type.Scalar.Integer);

            ipone.GetInput("LeftOperand").LinkTo(new CorePackage.Execution.Getter(i), "reference");
            ipone.SetInputValue("RightOperand", 1);

            ipp.GetInput("value").LinkTo(ipone, "result");

            loop.Do(ipp);

            //i = 42;
            CorePackage.Execution.Setter finalset = new CorePackage.Execution.Setter(i);

            finalset.SetInputValue("value", 42);

            loop.Done(finalset);

            //===============================

            whileTester.setEntryPoint(whileTester.addInstruction(loop));
            whileTester.Call();

            Assert.IsTrue(i.Value == 42);
        }
예제 #2
0
        public void moreOrLess()
        {
            Context moreOrLessCtx = new Context();

            EnumType cmp = new EnumType(Scalar.Integer);

            cmp.SetValue("MORE", new Variable(Scalar.Integer, 0));
            cmp.SetValue("LESS", new Variable(Scalar.Integer, 1));
            cmp.SetValue("NONE", new Variable(Scalar.Integer, 2));

            Variable ctx_min       = new Variable(Scalar.Integer, 0);
            Variable ctx_max       = new Variable(Scalar.Integer, 100);
            Variable ctx_lastGiven = new Variable(Scalar.Integer, -1);

            moreOrLessCtx.Declare(cmp, "COMPARISON", AccessMode.EXTERNAL);
            moreOrLessCtx.Declare(ctx_min, "min", AccessMode.INTERNAL);
            moreOrLessCtx.Declare(ctx_max, "max", AccessMode.INTERNAL);
            moreOrLessCtx.Declare(ctx_lastGiven, "lastGiven", AccessMode.INTERNAL);

            Function play = new Function();

            moreOrLessCtx.Declare(play, "Play", AccessMode.EXTERNAL);

            play.Declare(new Variable(cmp, cmp.GetValue("NONE").Value), "lastResult", AccessMode.EXTERNAL);
            play.SetVariableAs("lastResult", Function.VariableRole.PARAMETER);

            play.Declare(new Variable(Scalar.Integer, -1), "number", AccessMode.EXTERNAL);
            play.SetVariableAs("number", Function.VariableRole.RETURN);

            //if (lastResult == MORE)
            CorePackage.Execution.Operators.Equal lastResEqqMore = new CorePackage.Execution.Operators.Equal(cmp, cmp);
            lastResEqqMore.GetInput("LeftOperand").LinkTo(new CorePackage.Execution.Getter(cmp.GetValue("MORE")), "reference");
            lastResEqqMore.GetInput("RightOperand").LinkTo(new CorePackage.Execution.Getter(play.GetParameter("lastResult")), "reference");

            CorePackage.Execution.If play_entrypoint = new CorePackage.Execution.If();

            play.setEntryPoint(play.addInstruction(play_entrypoint));
            play_entrypoint.GetInput("condition").LinkTo(lastResEqqMore, "result");

            //min = lastGiven
            CorePackage.Execution.Setter minEqLastGiven = new CorePackage.Execution.Setter(ctx_min);
            minEqLastGiven.GetInput("value").LinkTo(new CorePackage.Execution.Getter(ctx_lastGiven), "reference");
            play_entrypoint.LinkTo(0, minEqLastGiven);     //"set" if true

            //if (lastResult == LESS)
            CorePackage.Execution.Operators.Equal lastResEqqLess = new CorePackage.Execution.Operators.Equal(cmp, cmp);
            lastResEqqLess.GetInput("LeftOperand").LinkTo(new CorePackage.Execution.Getter(play.GetParameter("lastResult")), "reference");
            lastResEqqLess.GetInput("RightOperand").LinkTo(new CorePackage.Execution.Getter(cmp.GetValue("LESS")), "reference");
            CorePackage.Execution.If condition = new CorePackage.Execution.If();
            condition.GetInput("condition").LinkTo(lastResEqqLess, "result");
            play_entrypoint.LinkTo(1, condition);     //"if" if false

            //max = lastGiven
            CorePackage.Execution.Setter maxEqLastGiven = new CorePackage.Execution.Setter(ctx_max);
            maxEqLastGiven.GetInput("value").LinkTo(new CorePackage.Execution.Getter(ctx_lastGiven), "reference");
            condition.LinkTo(0, maxEqLastGiven);

            //number = min/2 + max / 2
            CorePackage.Execution.Setter numCalculation = new CorePackage.Execution.Setter(play.GetReturn("number"));
            minEqLastGiven.LinkTo(0, numCalculation);
            condition.LinkTo(1, numCalculation);

            CorePackage.Execution.Operators.Add bigOp = new CorePackage.Execution.Operators.Add(
                Scalar.Integer,
                Scalar.Integer,
                Scalar.Integer);

            //min / 2
            CorePackage.Execution.Operators.Divide minmid = new CorePackage.Execution.Operators.Divide(
                Scalar.Integer,
                Scalar.Integer,
                Scalar.Integer);
            minmid.GetInput("LeftOperand").LinkTo(new CorePackage.Execution.Getter(ctx_min), "reference");
            minmid.SetInputValue("RightOperand", 2);
            bigOp.GetInput("LeftOperand").LinkTo(minmid, "result");

            //max / 2
            CorePackage.Execution.Operators.Divide maxmid = new CorePackage.Execution.Operators.Divide(
                Scalar.Integer,
                Scalar.Integer,
                Scalar.Integer);
            maxmid.GetInput("LeftOperand").LinkTo(new CorePackage.Execution.Getter(ctx_max), "reference");
            maxmid.SetInputValue("RightOperand", 2);
            bigOp.GetInput("RightOperand").LinkTo(maxmid, "result");

            numCalculation.GetInput("value").LinkTo(bigOp, "result");

            //if (number == lastGiven)
            condition = new CorePackage.Execution.If();
            CorePackage.Execution.Operators.Equal numberEqqLastGiven = new CorePackage.Execution.Operators.Equal(Scalar.Integer, Scalar.Integer);
            numberEqqLastGiven.GetInput("LeftOperand").LinkTo(new CorePackage.Execution.Getter(play.GetReturn("number")), "reference");
            numberEqqLastGiven.GetInput("RightOperand").LinkTo(new CorePackage.Execution.Getter(ctx_lastGiven), "reference");
            condition.GetInput("condition").LinkTo(numberEqqLastGiven, "result");

            maxEqLastGiven.LinkTo(0, numCalculation);
            numCalculation.LinkTo(0, condition);

            //lastGiven = number
            CorePackage.Execution.Setter lastGivenEqNumber = new CorePackage.Execution.Setter(ctx_lastGiven);
            lastGivenEqNumber.GetInput("value").LinkTo(new CorePackage.Execution.Getter(play.GetReturn("number")), "reference");
            condition.LinkTo(1, lastGivenEqNumber);

            //if (lastResult == MORE)
            CorePackage.Execution.If last = new CorePackage.Execution.If();
            last.GetInput("condition").LinkTo(lastResEqqMore, "result");

            condition.LinkTo(0, last);

            //number += 1
            CorePackage.Execution.Setter numberPlusOne = new CorePackage.Execution.Setter(play.GetReturn("number"));

            CorePackage.Execution.Operators.Add numAddOne = new CorePackage.Execution.Operators.Add(Scalar.Integer, Scalar.Integer, Scalar.Integer);
            numAddOne.GetInput("LeftOperand").LinkTo(new CorePackage.Execution.Getter(play.GetReturn("number")), "reference");
            numAddOne.SetInputValue("RightOperand", 1);
            numberPlusOne.GetInput("value").LinkTo(numAddOne, "result");
            last.LinkTo(0, numberPlusOne);

            //number -= 1
            CorePackage.Execution.Setter numberMinusOne = new CorePackage.Execution.Setter(play.GetReturn("number"));

            CorePackage.Execution.Operators.Substract numMinOne = new CorePackage.Execution.Operators.Substract(Scalar.Integer, Scalar.Integer, Scalar.Integer);
            numMinOne.GetInput("LeftOperand").LinkTo(new CorePackage.Execution.Getter(play.GetReturn("number")), "reference");
            numMinOne.SetInputValue("RightOperand", 1);
            numberMinusOne.GetInput("value").LinkTo(numMinOne, "result");
            last.LinkTo(1, numberMinusOne);

            //lastGiven = number (in any case)
            numberPlusOne.LinkTo(0, lastGivenEqNumber);
            numberMinusOne.LinkTo(0, lastGivenEqNumber);

            play.SetParameterValue("lastResult", cmp.GetValue("NONE").Value);

            System.Diagnostics.Debug.Write(play.ToDotFile());

            int mystery_number = 47;

            int i = 0;

            do
            {
                play.Call();

                string toprint = "IA give: " + play.GetReturn("number").Value.ToString();

                Debug.WriteLine(toprint);

                if (play.GetReturn("number").Value > mystery_number)
                {
                    play.SetParameterValue("lastResult", cmp.GetValue("LESS").Value);
                    Debug.WriteLine("==> It's less");
                }
                else if (play.GetReturn("number").Value < mystery_number)
                {
                    play.SetParameterValue("lastResult", cmp.GetValue("MORE").Value);
                    Debug.WriteLine("==> It's more");
                }
                else
                {
                    break;
                }
                ++i;
            } while (play.GetReturn("number").Value != mystery_number && i < 10);

            if (i == 10)
            {
                throw new Exception("Failed to reach mystery number in less that 10 times");
            }
            else
            {
                Debug.Write("AI found the mystery number: " + mystery_number.ToString());
            }
        }