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); }
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); }
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); }
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); }