public static string ToNormalForm(this ILambdaExpression lambdaExpression)
        {
            var normalFormVisitor = new NormalFormVisitor();

            lambdaExpression.Accept(normalFormVisitor);

            return(normalFormVisitor.Result);
        }
        public void GivenAProgramAndAParsedASTWeGetTheSameProgramFromTheAST()
        {
            var testLambda = "λs.(λz.(s z))";

            var lambdaExpression = _parser.Parse(testLambda);

            var printVisitor = new NormalFormVisitor();

            lambdaExpression.Accept(printVisitor);

            Assert.Equal("(λs.(λz.(s z)))", printVisitor.Result);
        }
        public void ApplicationTest()
        {
            var application = "λm.λn.λf.λx.m f (n f x)";

            var lambdaExpression = _parser.Parse(application);

            var printVisitor = new NormalFormVisitor();

            lambdaExpression.Accept(printVisitor);


            Assert.Equal("(λm.(λn.(λf.(λx.((m f) ((n f) x))))))", printVisitor.Result);

            Assert.IsType <Abstraction>(lambdaExpression);
        }
Beispiel #4
0
        public void GivenBoundAndUnboundVariableWithTheSameName()
        {
            var application = "(λx.(λy.xy))x";

            var lambdaExpression = _parser.Parse(application);

            var interpreter = new InterpreterVisitor();

            interpreter.Result.Accept(interpreter);

            var printVisitor = new NormalFormVisitor();

            lambdaExpression.Accept(printVisitor);

            Assert.Equal("(λt.yt)", printVisitor.Result);
        }
Beispiel #5
0
        public void GivenTheIdentifyFunctionParseAndInterpretToTheIdentifyFunction()
        {
            var identityFunction = "λx.x";

            var lambdaExpression = _parser.Parse(identityFunction);

            var interpreter = new InterpreterVisitor();

            lambdaExpression.Accept(interpreter);

            var printVisitor = new NormalFormVisitor();

            interpreter.Result.Accept(printVisitor);

            Assert.Equal("(λx.x)", printVisitor.Result);
        }
Beispiel #6
0
        public void GivenAnApplicationEvaluateTheApplicationCorrectly()
        {
            var application = @"(λx.(λy.x)) (λx.(λy.x))";

            var lambdaExpression = _parser.Parse(application);

            var interpreter = new InterpreterVisitor();
            var events      = new ReductionEventCollector();

            ConnectEvents(interpreter, events);

            lambdaExpression.Accept(interpreter);

            var printVisitor = new NormalFormVisitor();

            interpreter.Result.Accept(printVisitor);

            Assert.Collection(events.Events,
                              e => Assert.Equal("α", e),
                              e => Assert.Equal("β", e));

            Assert.Equal("λy.(λx0.(λx1.x0))", printVisitor.Result);
        }