public TreeNode Reduce(TreeNode node) { if (!(node is Application application)) { return(node); } if (!(application.Func is T)) { return(node); } return(ReduceImpl(AstReducer.Reduce(application.Arg)) ?? node); }
private void RunTest(string input, string output) { var ast = new AstParser(new FunctionDeclarationsFactory()).Parse(input); var reduced = AstReducer.Reduce(ast); var expected = new AstParser(new FunctionDeclarationsFactory()).Parse(output); Console.WriteLine("<<<<<<<<Input ast>>>>>>>>"); Console.WriteLine(ast.PrettyPrint()); Console.WriteLine("<<<<<<<<Reduced ast>>>>>>>>"); Console.WriteLine(reduced.PrettyPrint()); Console.WriteLine("<<<<<<<<Expected ast>>>>>>>>"); Console.WriteLine(expected.PrettyPrint()); Assert.AreEqual(output, reduced.Print()); }
public TreeNode Reduce(TreeNode node) { //ap (ap (ap if0 0) x1) x2 = x0 if (node is Application a1 && a1.Func is Application a2 && a2.Func is Application a3 && a3.Func is IfZero) { var arg = AstReducer.Reduce(a3.Arg); if (arg is Number number) { return(number.Value == 0 ? a2.Arg : a1.Arg); } } return(node); }
public TreeNode Reduce(TreeNode node) { if (!(node is Application application)) { return(node); } if (!(application.Func is IsNil)) { return(node); } var arg = AstReducer.Reduce(application.Arg); if (arg is Nil) { return(True.Instance); } return(False.Instance); }
public void Test1() { var x = "ap ap s s ap ap ap s t x0 x1"; Console.WriteLine(AstReducer.Reduce(new AstParser(new FunctionDeclarationsFactory()).Parse(x)).PrettyPrint()); }