open Mp6common let rubric_version = "1.0" let rubric_title = "CS421 Fall 2011 MP6" (************************************************************************** * You can add new test cases by adding new elements to the following lists * Format is: * TESTARG(, , , , ..., ) * * is the number of argument that the function being tested takes. **************************************************************************) let infer_exp tree = Mp6common.canon (Mp6common.infer_exp Solution.gather_exp_ty_substitution [] tree);; let infer_exp_stu tree = Mp6common.canon (Mp6common.infer_exp Student.gather_exp_ty_substitution [] tree);; let infer_dec tree = Mp6common.canon_dec (Mp6common.infer_dec Solution.gather_dec_ty_substitution [] tree);; let infer_dec_stu tree = Mp6common.canon_dec (Mp6common.infer_dec Student.gather_dec_ty_substitution [] tree);; let infer2_exp gamma tree = Mp6common.canon (Mp6common.infer_exp Solution.gather_exp_ty_substitution gamma tree);; let infer2_exp_stu gamma tree = Mp6common.canon (Mp6common.infer_exp Student.gather_exp_ty_substitution gamma tree);; let infer2_dec gamma tree = Mp6common.canon_dec (Mp6common.infer_dec Solution.gather_dec_ty_substitution gamma tree);; let infer2_dec_stu gamma tree = Mp6common.canon_dec (Mp6common.infer_dec Student.gather_dec_ty_substitution gamma tree);; (* environment *) let env0 = [];; let env1 = make_env "f" ([0], mk_fun_ty bool_ty (TyVar 0));; let env2 = [("f",([0], mk_fun_ty bool_ty (TyVar 0)));("",([1], mk_fun_ty (TyVar 0) (TyVar 1)));("1111111111111111111111111111111111111111111111111111111111111111",([2], int_ty))] (* simple expressions *) let con_exp1 = ConstExp(BoolConst true);; let var_exp1 = VarExp "f";; let var_exp2 = VarExp "";; let var_exp3 = VarExp "1111111111111111111111111111111111111111111111111111111111111111";; let bin_exp1 = BinOpAppExp(ConsOp, ConstExp (IntConst 62), ConstExp NilConst);; let bin_exp2 = BinOpAppExp(ConsOp, VarExp "", ConstExp NilConst);; let bin_exp3 = BinOpAppExp(EqOp, VarExp "", VarExp "f");; let bin_exp4 = BinOpAppExp(IntMinusOp, ConstExp (IntConst 62), ConstExp (IntConst 1));; let mon_exp1 = MonOpAppExp(PrintStringOp, ConstExp(StringConst "hi"));; let mon_exp2 = MonOpAppExp(IntNegOp, BinOpAppExp(ConsOp, ConstExp (IntConst 62), ConstExp NilConst));; let mon_exp3 = MonOpAppExp(HdOp, BinOpAppExp(ConsOp, VarExp "", ConstExp NilConst));; let mon_exp4 = MonOpAppExp(FstOp, BinOpAppExp(EqOp, VarExp "", VarExp "f"));; let mon_exp5 = MonOpAppExp(SndOp, BinOpAppExp(IntMinusOp, ConstExp (IntConst 62), ConstExp (IntConst 1)));; let if_exp1 = IfExp(ConstExp(BoolConst true), ConstExp(IntConst 62), ConstExp(IntConst 252));; let if_exp2 = IfExp(ConstExp(NilConst), ConstExp(NilConst), ConstExp(NilConst));; let if_exp3 = IfExp(ConstExp(BoolConst true), BinOpAppExp(EqOp, VarExp "", VarExp "f"), ConstExp(IntConst 252));; let if_exp4 = IfExp(ConstExp(BoolConst false), ConstExp(NilConst), BinOpAppExp(EqOp, VarExp "", VarExp "f"));; let if_exp5 = IfExp(ConstExp(BoolConst true), IfExp(ConstExp(BoolConst true), IfExp(ConstExp(BoolConst true), ConstExp(IntConst 62), ConstExp(IntConst 252)), BinOpAppExp(EqOp, VarExp "", VarExp "f")), BinOpAppExp(EqOp, VarExp "", VarExp "f"));; let if_exp6 = IfExp(ConstExp(BoolConst false), ConstExp(NilConst), IfExp(ConstExp(BoolConst false), ConstExp(NilConst), IfExp(ConstExp(BoolConst false), ConstExp(NilConst), IfExp(ConstExp(BoolConst false), ConstExp(NilConst), BinOpAppExp(EqOp, VarExp "", VarExp "f")))));; let if_exp7 = IfExp(ConstExp(BoolConst true), BinOpAppExp(EqOp, IfExp(ConstExp(BoolConst true), BinOpAppExp(EqOp, VarExp "", IfExp(ConstExp(BoolConst true), BinOpAppExp(EqOp, VarExp "", VarExp "f"), BinOpAppExp(EqOp, VarExp "", VarExp "f"))), BinOpAppExp(EqOp, IfExp(ConstExp(BoolConst true), BinOpAppExp(EqOp, VarExp "", VarExp "f"), BinOpAppExp(EqOp, VarExp "", VarExp "f")), VarExp "f")), VarExp "f"), BinOpAppExp(EqOp, IfExp(ConstExp(BoolConst true), BinOpAppExp(EqOp, VarExp "", VarExp "f"), BinOpAppExp(EqOp, VarExp "", VarExp "f")), IfExp(ConstExp(BoolConst true), BinOpAppExp(EqOp, VarExp "", VarExp "f"), BinOpAppExp(EqOp, VarExp "", VarExp "f"))));; let fun_exp1 = FnExp("x", BinOpAppExp(IntPlusOp, VarExp "x", VarExp "x"));; let fun_exp2 = FnExp("", BinOpAppExp(EqOp, VarExp "", VarExp "f"));; let fun_exp3 = FnExp("", BinOpAppExp(EqOp, ConstExp(NilConst), VarExp "f"));; let fun_exp4 = FnExp("x", BinOpAppExp(EqOp, ConstExp(NilConst), IfExp(ConstExp(BoolConst false), ConstExp(NilConst), IfExp(ConstExp(BoolConst false), ConstExp(NilConst), IfExp(ConstExp(BoolConst false), ConstExp(NilConst), IfExp(ConstExp(BoolConst false), ConstExp(NilConst), BinOpAppExp(EqOp, VarExp "", VarExp "f")))))));; let fun_exp5 = FnExp("x", BinOpAppExp(EqOp, FnExp("x", BinOpAppExp(EqOp, ConstExp(NilConst), VarExp "x")), FnExp("y", BinOpAppExp(EqOp, VarExp "x", VarExp "y"))));; let fun_exp6 = FnExp("x", BinOpAppExp(EqOp, FnExp("", BinOpAppExp(EqOp, FnExp("x", BinOpAppExp(EqOp, ConstExp(NilConst), IfExp(ConstExp(BoolConst false), ConstExp(NilConst), IfExp(ConstExp(BoolConst false), ConstExp(NilConst), IfExp(ConstExp(BoolConst false), FnExp("x", BinOpAppExp(EqOp, FnExp("x", BinOpAppExp(EqOp, ConstExp(NilConst), VarExp "x")), FnExp("f", BinOpAppExp(EqOp, VarExp "x", VarExp "f")))), IfExp(ConstExp(BoolConst false), MonOpAppExp(PrintStringOp, ConstExp(StringConst "hi")), BinOpAppExp(EqOp, VarExp "", VarExp "f"))))))), VarExp "x")), FnExp("y", BinOpAppExp(EqOp, VarExp "x", VarExp "y"))));; let fun_exp7 = FnExp("", BinOpAppExp(EqOp, FnExp("x", BinOpAppExp(EqOp, ConstExp(NilConst), VarExp "x")), FnExp("y", BinOpAppExp(EqOp, VarExp "x", VarExp "y"))));; let app_exp1 = AppExp(FnExp("x", BinOpAppExp(IntPlusOp, VarExp "x", VarExp "x")), ConstExp(IntConst 62));; let app_exp2 = AppExp(fun_exp2, VarExp "f");; let app_exp3 = AppExp(fun_exp3, fun_exp3);; let app_exp4 = AppExp(fun_exp6, if_exp2);; let app_exp5 = AppExp(FnExp("", BinOpAppExp(EqOp, AppExp (FnExp("x", BinOpAppExp(EqOp, ConstExp(NilConst), VarExp "x")), if_exp2), AppExp (FnExp("y", BinOpAppExp(EqOp, VarExp "x", VarExp "y")), if_exp2))), if_exp2);; let app_exp6 = AppExp(AppExp( AppExp(fun_exp3, fun_exp3),fun_exp3),VarExp "f");; let app_exp7 = IfExp(ConstExp(BoolConst false), AppExp(fun_exp2, VarExp "f"), IfExp(ConstExp(BoolConst false), AppExp(AppExp( AppExp(fun_exp3, fun_exp3),fun_exp3),VarExp "f"), IfExp(ConstExp(BoolConst false), AppExp(AppExp( AppExp(fun_exp3, fun_exp3),fun_exp3),VarExp "f"), IfExp(ConstExp(BoolConst false), AppExp(AppExp( AppExp(fun_exp3, fun_exp3),fun_exp3),VarExp "f"), BinOpAppExp(EqOp, AppExp(AppExp( AppExp(fun_exp3, fun_exp3),fun_exp3),VarExp "f"), AppExp(AppExp( AppExp(fun_exp3, fun_exp3),fun_exp3),VarExp "f"))))));; let raise_exp1 = RaiseExp(IfExp(ConstExp(BoolConst true), ConstExp(IntConst 62), ConstExp(IntConst 252)));; let raise_exp2 = RaiseExp(AppExp(fun_exp2, VarExp "f"));; let raise_exp3 = RaiseExp(IfExp(ConstExp(BoolConst false), AppExp(fun_exp2, VarExp "f"), IfExp(ConstExp(BoolConst false), AppExp(AppExp( AppExp(fun_exp3, fun_exp3),fun_exp3),VarExp "f"), IfExp(ConstExp(BoolConst false), AppExp(AppExp( AppExp(fun_exp3, fun_exp3),fun_exp3),VarExp "f"), IfExp(ConstExp(BoolConst false), AppExp(AppExp( AppExp(fun_exp3, fun_exp3),fun_exp3),VarExp "f"), BinOpAppExp(EqOp, AppExp(AppExp( AppExp(fun_exp3, fun_exp3),fun_exp3),VarExp "f"), AppExp(AppExp( AppExp(fun_exp3, fun_exp3),fun_exp3),VarExp "f")))))));; let raise_exp4 = RaiseExp(RaiseExp(RaiseExp(RaiseExp(RaiseExp(RaiseExp(RaiseExp(AppExp(fun_exp2, VarExp "f"))))))));; let raise_exp5 = IfExp(ConstExp(BoolConst false), RaiseExp(AppExp(fun_exp2, VarExp "")), IfExp(ConstExp(BoolConst false), AppExp(AppExp( AppExp(fun_exp3, fun_exp3),fun_exp3),RaiseExp(AppExp(fun_exp2, VarExp ""))), IfExp(ConstExp(BoolConst false), AppExp(AppExp( AppExp(fun_exp3, fun_exp3),fun_exp3),RaiseExp(AppExp(fun_exp2, VarExp ""))), IfExp(ConstExp(BoolConst false), AppExp(AppExp( AppExp(fun_exp3, fun_exp3),fun_exp3),RaiseExp(AppExp(fun_exp2, VarExp "f"))), BinOpAppExp(EqOp, AppExp(AppExp( AppExp(fun_exp3, fun_exp3),fun_exp3),VarExp "f"), AppExp(AppExp( AppExp(fun_exp3, fun_exp3),fun_exp3),RaiseExp(RaiseExp(RaiseExp(RaiseExp(RaiseExp(RaiseExp(RaiseExp(AppExp(fun_exp2, VarExp "f"))))))))))))));; let val_dec1 = Val("x", BinOpAppExp(ConsOp, ConstExp NilConst,ConstExp NilConst));; let val_dec2 = Val("", ConstExp UnitConst);; let val_dec3 = Val("f", RaiseExp(AppExp(fun_exp2, VarExp "f")));; let val_dec4 = Val("x", FnExp("x", BinOpAppExp(EqOp, FnExp("x", BinOpAppExp(EqOp, ConstExp(NilConst), VarExp "x")), FnExp("y", BinOpAppExp(EqOp, VarExp "x", VarExp "y")))));; let val_dec5 = Val("", LetExp (Val("f", LetExp (Val("f", LetExp (Val("", LetExp (Val("", LetExp (Val("", MonOpAppExp(HdOp, BinOpAppExp(ConsOp, VarExp "", ConstExp NilConst))),ConstExp UnitConst)),RaiseExp(AppExp(fun_exp2, VarExp "f")))),RaiseExp(IfExp(ConstExp(BoolConst true), ConstExp(IntConst 62), ConstExp(IntConst 252))))),AppExp(fun_exp3, fun_exp3))),AppExp(fun_exp6, if_exp2)));; let rec_dec1 = Rec("length", "list", IfExp(BinOpAppExp(EqOp, VarExp "list", ConstExp NilConst), ConstExp (IntConst 0), BinOpAppExp(IntPlusOp, ConstExp (IntConst 1), (AppExp(VarExp "length", MonOpAppExp(TlOp,VarExp "list"))))));; let rec_dec2 = Rec("", "",ConstExp UnitConst);; let rec_dec3 = Rec("","",AppExp(fun_exp2, VarExp ""));; let rec_dec4 = Rec("Rec","f",FnExp("x", BinOpAppExp(EqOp, FnExp("f", BinOpAppExp(EqOp, ConstExp(NilConst), VarExp "f")), FnExp("x", BinOpAppExp(EqOp, VarExp "x", VarExp "f")))));; let rec_dec5 = Rec("Rec","f",RaiseExp(RaiseExp(RaiseExp(RaiseExp(RaiseExp(RaiseExp(RaiseExp(AppExp(fun_exp2, VarExp "f")))))))));; let rec_dec6 = Rec("Rec","f",IfExp(ConstExp(BoolConst false), RaiseExp(AppExp(fun_exp2, VarExp "")), IfExp(ConstExp(BoolConst false), AppExp(AppExp( AppExp(fun_exp3, fun_exp3),fun_exp3),RaiseExp(AppExp(fun_exp2, VarExp "Rec"))), IfExp(ConstExp(BoolConst false), AppExp(AppExp( AppExp(fun_exp3, fun_exp3),fun_exp3),RaiseExp(AppExp(fun_exp2, VarExp "Rec"))), IfExp(ConstExp(BoolConst false), AppExp(AppExp( AppExp(fun_exp3, fun_exp3),fun_exp3),RaiseExp(AppExp(fun_exp2, VarExp "f"))), BinOpAppExp(EqOp, AppExp(AppExp( AppExp(fun_exp3, fun_exp3),fun_exp3),VarExp "f"), AppExp(AppExp( AppExp(fun_exp3, fun_exp3),fun_exp3),RaiseExp(RaiseExp(RaiseExp(RaiseExp(RaiseExp(RaiseExp(RaiseExp(AppExp(fun_exp2, VarExp "f")))))))))))))));; let rec_dec7 = Rec("Rec","f",LetExp(Rec("","",LetExp(Rec("","",LetExp(Rec("Rec","f",LetExp(Rec("Rec","f",LetExp(Rec("Rec","f",LetExp(Val("Rec", RaiseExp(AppExp(fun_exp2, VarExp "Rec"))),FnExp("x", BinOpAppExp(EqOp, FnExp("f", BinOpAppExp(EqOp, ConstExp(NilConst), VarExp "f")), FnExp("x", BinOpAppExp(EqOp, VarExp "x", VarExp "f")))))),AppExp(fun_exp2, VarExp ""))),AppExp(fun_exp2, VarExp ""))),AppExp(fun_exp2, VarExp ""))),AppExp(fun_exp2, VarExp ""))),AppExp(fun_exp2, VarExp "")));; let rec_dec8 = Rec("Rec","f",IfExp(ConstExp(BoolConst false), LetExp (Rec("","",AppExp(fun_exp2, VarExp "")),(AppExp (VarExp "Rec",VarExp ""))), LetExp (Rec("Rec","f",FnExp("x",AppExp (VarExp "",VarExp"f"))),(AppExp (VarExp "Rec",VarExp "")))));; let seq_dec1 = Seq(Val("x", ConstExp (BoolConst true)), Val("y", ConstExp (IntConst 3)));; let seq_dec2 = Seq(Rec("", "",ConstExp UnitConst),Rec("","",AppExp(fun_exp2, VarExp "")));; let seq_dec3 = Seq(Val("f", RaiseExp(AppExp(fun_exp2, VarExp "Rec"))),Rec("Rec","x",AppExp(fun_exp2, VarExp "f")));; let seq_dec4 = Seq(Rec("Rec","f",FnExp("x", BinOpAppExp(EqOp, FnExp("f", BinOpAppExp(EqOp, ConstExp(NilConst), VarExp "f")), FnExp("x", BinOpAppExp(EqOp, VarExp "x", VarExp "f"))))),Val("x", FnExp("x", BinOpAppExp(EqOp, FnExp("x", BinOpAppExp(EqOp, ConstExp(NilConst), VarExp "x")), FnExp("y", BinOpAppExp(EqOp, VarExp "x", VarExp "y"))))));; let seq_dec5 = Seq(Seq(Seq(Seq(Seq(Seq(Seq(Val("Rec", RaiseExp(AppExp(fun_exp2, VarExp "Rec"))),Val("f", RaiseExp(AppExp(fun_exp2, VarExp "f")))),Val("x", FnExp("x", BinOpAppExp(EqOp, FnExp("x", BinOpAppExp(EqOp, ConstExp(NilConst), VarExp "x")), FnExp("y", BinOpAppExp(EqOp, VarExp "x", VarExp "y")))))),Rec("Rec","f",FnExp("x", BinOpAppExp(EqOp, FnExp("f", BinOpAppExp(EqOp, ConstExp(NilConst), VarExp "f")), FnExp("x", BinOpAppExp(EqOp, VarExp "x", VarExp "f")))))),Rec("Rec","f",FnExp("x", BinOpAppExp(EqOp, FnExp("f", BinOpAppExp(EqOp, ConstExp(NilConst), VarExp "f")), FnExp("x", BinOpAppExp(EqOp, VarExp "x", VarExp "f")))))),Val("f", RaiseExp(AppExp(fun_exp2, VarExp "f")))),Rec("","",AppExp(fun_exp2, VarExp ""))),Rec("", "",ConstExp UnitConst));; let seq_dec6 = Seq(Rec("", "",ConstExp UnitConst),Seq(Val("f", RaiseExp(AppExp(fun_exp2, VarExp "f"))),Seq(Rec("Rec","f",FnExp("x", BinOpAppExp(EqOp, FnExp("f", BinOpAppExp(EqOp, ConstExp(NilConst), VarExp "f")), FnExp("x", BinOpAppExp(EqOp, VarExp "x", VarExp "f"))))),Seq(Rec("Rec","f",FnExp("x", BinOpAppExp(EqOp, FnExp("f", BinOpAppExp(EqOp, ConstExp(NilConst), VarExp "f")), FnExp("x", BinOpAppExp(EqOp, VarExp "x", VarExp "f"))))),Seq(Rec("Rec","Rec",AppExp(fun_exp2, VarExp "Rec")),Seq(Val("f", RaiseExp(AppExp(fun_exp2, VarExp "f"))),Seq(Val("Rec", RaiseExp(AppExp(fun_exp2, VarExp "Rec"))),Seq(Val("x", ConstExp (BoolConst true)), Val("y", ConstExp (IntConst 3))))))))));; let seq_dec7 = Seq(Rec("", "",LetExp (Seq (Val("f", RaiseExp(AppExp(fun_exp2, VarExp "f"))),Val("Rec", RaiseExp(AppExp(fun_exp2, VarExp "Rec")))),AppExp (VarExp "Rec",VarExp ""))),Rec ("Rec","f",LetExp (Seq (Rec("Rec","f",FnExp("x", BinOpAppExp(EqOp, FnExp("f", BinOpAppExp(EqOp, ConstExp(NilConst), VarExp "f")), FnExp("x", BinOpAppExp(EqOp, VarExp "x", VarExp "f"))))),Rec("Rec","f",FnExp("x", BinOpAppExp(EqOp, FnExp("f", BinOpAppExp(EqOp, ConstExp(NilConst), VarExp "f")), FnExp("x", BinOpAppExp(EqOp, VarExp "x", VarExp "f")))))),AppExp (VarExp "Rec",VarExp ""))));; let seq_dec8 = Seq(Rec("", "",LetExp (Seq(Rec("","",AppExp(fun_exp2, VarExp "")),Rec("Rec","f",FnExp("x", BinOpAppExp(EqOp, FnExp("f", BinOpAppExp(EqOp, ConstExp(NilConst), VarExp "f")), FnExp("x", BinOpAppExp(EqOp, VarExp "x", VarExp "f")))))),LetExp (Seq (Rec("","",AppExp(fun_exp2, VarExp "")),Val("f", RaiseExp(AppExp(fun_exp2, VarExp "f")))),LetExp (Seq(Rec("length", "list", IfExp(BinOpAppExp(EqOp, VarExp "list", ConstExp NilConst), ConstExp (IntConst 0), BinOpAppExp(IntPlusOp, ConstExp (IntConst 1), (AppExp(VarExp "length", MonOpAppExp(TlOp,VarExp "list")))))),Rec("","",AppExp(fun_exp2, VarExp ""))),LetExp (Seq (Rec("", "",ConstExp UnitConst),Rec("Rec","f",RaiseExp(RaiseExp(RaiseExp(RaiseExp(RaiseExp(RaiseExp(RaiseExp(AppExp(fun_exp2, VarExp "f")))))))))),AppExp (VarExp "Rec",VarExp "f")))))),Rec("","",AppExp(fun_exp2, VarExp "")));; let let_exp1 = LetExp(Val("y", ConstExp(IntConst 5)), BinOpAppExp(IntPlusOp, VarExp "y", VarExp "y"));; let let_exp2 = LetExp(Val("f", VarExp "f"), VarExp "f");; let let_exp3 = LetExp(Rec("", "",VarExp ""),AppExp (VarExp "",VarExp "f"));; let let_exp4 = LetExp(Rec("Rec","f",FnExp("x", BinOpAppExp(EqOp, FnExp("f", BinOpAppExp(EqOp, ConstExp(NilConst), VarExp "f")), FnExp("x", BinOpAppExp(EqOp, VarExp "x", VarExp "f"))))),LetExp (Rec ("Rec","x",VarExp "x"),AppExp (VarExp "Rec",VarExp "f")));; let let_exp5 = LetExp(Rec ("","",LetExp (Rec ("Rec","f",FnExp("x", BinOpAppExp(EqOp, FnExp("f", BinOpAppExp(EqOp, ConstExp(NilConst), VarExp "f")), FnExp("x", BinOpAppExp(EqOp, VarExp "x", VarExp "f"))))),VarExp "")),LetExp (Rec ("Rec","x",LetExp (Rec("","",AppExp (VarExp "Rec",VarExp "")), AppExp (VarExp "",VarExp "Rec"))),AppExp (VarExp "",VarExp "Rec")));; let let_exp6 = LetExp (Seq(Rec("", "",LetExp (Seq (Val("f", RaiseExp(AppExp(fun_exp2, VarExp "f"))),Val("Rec", RaiseExp(AppExp(fun_exp2, VarExp "Rec")))),AppExp (VarExp "Rec",VarExp ""))),Rec ("Rec","f",LetExp (Seq (Rec("Rec","f",FnExp("x", BinOpAppExp(EqOp, FnExp("f", BinOpAppExp(EqOp, ConstExp(NilConst), VarExp "f")), FnExp("x", BinOpAppExp(EqOp, VarExp "x", VarExp "f"))))),Rec("Rec","f",FnExp("x", BinOpAppExp(EqOp, FnExp("f", BinOpAppExp(EqOp, ConstExp(NilConst), VarExp "f")), FnExp("x", BinOpAppExp(EqOp, VarExp "x", VarExp "f")))))),AppExp (VarExp "Rec",VarExp "")))),LetExp(Val("", VarExp ""), VarExp ""));; let let_exp7 = LetExp(Val("y", ConstExp(IntConst 5)),LetExp (Seq (Seq (Rec("","",AppExp(fun_exp2, VarExp "")),Seq (Rec("Rec","f",FnExp("x", BinOpAppExp(EqOp, FnExp("f", BinOpAppExp(EqOp, ConstExp(NilConst), VarExp "f")), FnExp("x", BinOpAppExp(EqOp, VarExp "x", VarExp "f"))))),Rec("","",AppExp(fun_exp2, VarExp "")))),Seq (Seq (Rec("Rec","f",RaiseExp(RaiseExp(RaiseExp(RaiseExp(RaiseExp(RaiseExp(RaiseExp(AppExp(fun_exp2, VarExp "f"))))))))),Rec("Rec","f",RaiseExp(RaiseExp(RaiseExp(RaiseExp(RaiseExp(RaiseExp(RaiseExp(AppExp(fun_exp2, VarExp "f")))))))))),Rec("Rec","f",FnExp("x", BinOpAppExp(EqOp, FnExp("f", BinOpAppExp(EqOp, ConstExp(NilConst), VarExp "f")), FnExp("x", BinOpAppExp(EqOp, VarExp "x", VarExp "f"))))))),LetExp (Val ("f",ConstExp (UnitConst )),AppExp (VarExp "Rec",VarExp ""))));; let let_exp8 = LetExp (Seq (Rec ("","",VarExp ""),Rec ("Rec","f",AppExp (VarExp "",VarExp "f"))),LetExp (Seq (Val ("",VarExp "f"),Val ("",LetExp (Seq (Rec ("","",VarExp ""),Rec ("Rec","f",AppExp (VarExp "",VarExp "f"))),LetExp (Seq (Val ("",VarExp "f"),Rec ("Rec","f",LetExp (Val ("Rec",VarExp "f"),AppExp (VarExp "Rec",VarExp "")))),AppExp (VarExp "",VarExp "f"))))),AppExp (VarExp "",VarExp "f")));; let handle_exp1 = HandleExp(BinOpAppExp(ConcatOp, ConstExp(StringConst "What"), RaiseExp(ConstExp(IntConst 3))), Some 0, ConstExp(StringConst " do you mean?"), [(None, ConstExp(StringConst " the heck?")) ]);; let handle_exp2 = HandleExp(RaiseExp(ConstExp(IntConst 3)), Some 0, ConstExp(StringConst " do you mean?"), []);; let handle_exp3 = HandleExp(VarExp "", Some 0, VarExp "f", [(None, VarExp "f"); (Some 0,VarExp "");(Some 1,VarExp "")]);; let handle_exp4 = HandleExp(LetExp(Rec("Rec","f",FnExp("x", BinOpAppExp(EqOp, FnExp("f", BinOpAppExp(EqOp, ConstExp(NilConst), VarExp "f")), FnExp("x", BinOpAppExp(EqOp, VarExp "x", VarExp "f"))))),LetExp (Rec ("Rec","x",VarExp "x"),AppExp (VarExp "Rec",VarExp "f"))), Some 0, let_exp2, [(Some 0, let_exp1); (Some 0, let_exp2);(Some 0, let_exp3)]);; let handle_exp5 = HandleExp(LetExp(Rec("Rec","f",FnExp("x", BinOpAppExp(EqOp, FnExp("f", BinOpAppExp(EqOp, ConstExp(NilConst), VarExp "f")), FnExp("x", BinOpAppExp(EqOp, VarExp "x", VarExp "f"))))),LetExp (Rec ("Rec","x",VarExp "x"),HandleExp(LetExp(Rec("Rec","f",FnExp("x", BinOpAppExp(EqOp, FnExp("f", BinOpAppExp(EqOp, ConstExp(NilConst), VarExp "f")), FnExp("x", BinOpAppExp(EqOp, VarExp "x", VarExp "f"))))),LetExp (Rec ("Rec","x",VarExp "x"),AppExp (VarExp "Rec",VarExp "f"))), Some 0, handle_exp2, [(Some 0, handle_exp4); (Some 0, handle_exp1);(Some 0, handle_exp3)]))), Some 0, handle_exp2, [(Some 0, handle_exp4); (Some 0, handle_exp1);(Some 0, handle_exp3)]);; let local_dec1 = Local(Val("x", ConstExp (BoolConst true)), Val("y", IfExp(VarExp "x", ConstExp (IntConst 3), ConstExp(IntConst 4))));; let local_dec2 = Local(Val("f", RaiseExp(AppExp(fun_exp2, VarExp "Rec"))),Rec("Rec","x",AppExp(fun_exp2, VarExp "f")));; let local_dec3 = Local(Rec("Rec","f",FnExp("x", BinOpAppExp(EqOp, FnExp("f", BinOpAppExp(EqOp, ConstExp(NilConst), VarExp "f")), FnExp("x", BinOpAppExp(EqOp, VarExp "x", VarExp "f"))))),Val("x", FnExp("x", BinOpAppExp(EqOp, FnExp("x", BinOpAppExp(EqOp, ConstExp(NilConst), VarExp "x")), FnExp("y", BinOpAppExp(EqOp, VarExp "x", VarExp "y"))))));; let local_dec4 = Local(Local(Local(Local(Local(Local(Local(Val("Rec", RaiseExp(AppExp(fun_exp2, VarExp "Rec"))),Val("f", RaiseExp(AppExp(fun_exp2, VarExp "f")))),Val("x", FnExp("x", BinOpAppExp(EqOp, FnExp("x", BinOpAppExp(EqOp, ConstExp(NilConst), VarExp "x")), FnExp("y", BinOpAppExp(EqOp, VarExp "x", VarExp "y")))))),Rec("Rec","f",FnExp("x", BinOpAppExp(EqOp, FnExp("f", BinOpAppExp(EqOp, ConstExp(NilConst), VarExp "f")), FnExp("x", BinOpAppExp(EqOp, VarExp "x", VarExp "f")))))),Rec("Rec","f",FnExp("x", BinOpAppExp(EqOp, FnExp("f", BinOpAppExp(EqOp, ConstExp(NilConst), VarExp "f")), FnExp("x", BinOpAppExp(EqOp, VarExp "x", VarExp "f")))))),Val("f", RaiseExp(AppExp(fun_exp2, VarExp "f")))),Rec("","",AppExp(fun_exp2, VarExp ""))),Rec("", "",ConstExp UnitConst));; let local_dec5 = Local(Rec("", "",ConstExp UnitConst),Local(Val("f", RaiseExp(AppExp(fun_exp2, VarExp "f"))),Local(Rec("Rec","f",FnExp("x", BinOpAppExp(EqOp, FnExp("f", BinOpAppExp(EqOp, ConstExp(NilConst), VarExp "f")), FnExp("x", BinOpAppExp(EqOp, VarExp "x", VarExp "f"))))),Local(Rec("Rec","f",FnExp("x", BinOpAppExp(EqOp, FnExp("f", BinOpAppExp(EqOp, ConstExp(NilConst), VarExp "f")), FnExp("x", BinOpAppExp(EqOp, VarExp "x", VarExp "f"))))),Local(Rec("Rec","Rec",AppExp(fun_exp2, VarExp "Rec")),Local(Val("f", RaiseExp(AppExp(fun_exp2, VarExp "f"))),Local(Val("Rec", RaiseExp(AppExp(fun_exp2, VarExp "Rec"))),Local(Val("x", ConstExp (BoolConst true)), Val("y", ConstExp (IntConst 3))))))))));; (* This list is for regular problems *) let rubric = [ TEST2ARG_TWOFUN(0, infer2_exp, infer2_exp_stu, env0, con_exp1); TEST2ARG_TWOFUN(1, infer2_exp, infer2_exp_stu, env1, var_exp1); TEST2ARG_TWOFUN(1, infer2_exp, infer2_exp_stu, env0, var_exp2); TEST2ARG_TWOFUN(1, infer2_exp, infer2_exp_stu, env0, var_exp3); TEST2ARG_TWOFUN(1, infer2_exp, infer2_exp_stu, env2, var_exp1); TEST2ARG_TWOFUN(1, infer2_exp, infer2_exp_stu, env2, var_exp1); TEST2ARG_TWOFUN(1, infer2_exp, infer2_exp_stu, env0, bin_exp1); TEST2ARG_TWOFUN(1, infer2_exp, infer2_exp_stu, env0, bin_exp2); TEST2ARG_TWOFUN(1, infer2_exp, infer2_exp_stu, env2, bin_exp3); TEST2ARG_TWOFUN(1, infer2_exp, infer2_exp_stu, env0, bin_exp4); TEST2ARG_TWOFUN(1, infer2_exp, infer2_exp_stu, env0, bin_exp3); TEST2ARG_TWOFUN(1, infer2_exp, infer2_exp_stu, env0, mon_exp1); TEST2ARG_TWOFUN(1, infer2_exp, infer2_exp_stu, env1, mon_exp2); TEST2ARG_TWOFUN(1, infer2_exp, infer2_exp_stu, env2, mon_exp3); TEST2ARG_TWOFUN(1, infer2_exp, infer2_exp_stu, env2, mon_exp4); TEST2ARG_TWOFUN(1, infer2_exp, infer2_exp_stu, env1, mon_exp5); TEST2ARG_TWOFUN(1, infer2_exp, infer2_exp_stu, env0, if_exp1); TEST2ARG_TWOFUN(1, infer2_exp, infer2_exp_stu, env0, if_exp2); TEST2ARG_TWOFUN(1, infer2_exp, infer2_exp_stu, env0, if_exp3); TEST2ARG_TWOFUN(1, infer2_exp, infer2_exp_stu, env0, if_exp4); TEST2ARG_TWOFUN(1, infer2_exp, infer2_exp_stu, env2, if_exp5); TEST2ARG_TWOFUN(1, infer2_exp, infer2_exp_stu, env2, if_exp6); TEST2ARG_TWOFUN(1, infer2_exp, infer2_exp_stu, env2, if_exp7); TEST2ARG_TWOFUN(1, infer2_exp, infer2_exp_stu, env0, if_exp6); TEST2ARG_TWOFUN(1, infer2_exp, infer2_exp_stu, env0, if_exp7); TEST2ARG_TWOFUN(1, infer2_exp, infer2_exp_stu, env0, if_exp5); TEST2ARG_TWOFUN(1, infer2_exp, infer2_exp_stu, env0, fun_exp1); TEST2ARG_TWOFUN(1, infer2_exp, infer2_exp_stu, env0, fun_exp2); TEST2ARG_TWOFUN(1, infer2_exp, infer2_exp_stu, env2, fun_exp2); TEST2ARG_TWOFUN(1, infer2_exp, infer2_exp_stu, env1, fun_exp3); TEST2ARG_TWOFUN(1, infer2_exp, infer2_exp_stu, env2, fun_exp4); TEST2ARG_TWOFUN(1, infer2_exp, infer2_exp_stu, env0, fun_exp5); TEST2ARG_TWOFUN(1, infer2_exp, infer2_exp_stu, env0, fun_exp6); TEST2ARG_TWOFUN(1, infer2_exp, infer2_exp_stu, env2, fun_exp6); TEST2ARG_TWOFUN(1, infer2_exp, infer2_exp_stu, env0, fun_exp7); TEST2ARG_TWOFUN(1, infer2_exp, infer2_exp_stu, env2, fun_exp7); TEST2ARG_TWOFUN(1, infer2_exp, infer2_exp_stu, env0, app_exp1); TEST2ARG_TWOFUN(1, infer2_exp, infer2_exp_stu, env1, app_exp2); TEST2ARG_TWOFUN(1, infer2_exp, infer2_exp_stu, env0, app_exp3); TEST2ARG_TWOFUN(1, infer2_exp, infer2_exp_stu, env0, app_exp4); TEST2ARG_TWOFUN(1, infer2_exp, infer2_exp_stu, env0, app_exp5); TEST2ARG_TWOFUN(1, infer2_exp, infer2_exp_stu, env0, app_exp6); TEST2ARG_TWOFUN(1, infer2_exp, infer2_exp_stu, env0, app_exp7); TEST2ARG_TWOFUN(1, infer2_exp, infer2_exp_stu, env2, app_exp3); TEST2ARG_TWOFUN(1, infer2_exp, infer2_exp_stu, env2, app_exp6); TEST2ARG_TWOFUN(1, infer2_exp, infer2_exp_stu, env2, app_exp7); TEST2ARG_TWOFUN(1, infer2_exp, infer2_exp_stu, env2, raise_exp1); TEST2ARG_TWOFUN(1, infer2_exp, infer2_exp_stu, env2, raise_exp2); TEST2ARG_TWOFUN(1, infer2_exp, infer2_exp_stu, env2, raise_exp3); TEST2ARG_TWOFUN(1, infer2_exp, infer2_exp_stu, env2, raise_exp4); TEST2ARG_TWOFUN(1, infer2_exp, infer2_exp_stu, env2, raise_exp5); TEST2ARG_TWOFUN(1, infer2_exp, infer2_exp_stu, env0, raise_exp5); TEST2ARG_TWOFUN(1, infer2_exp, infer2_exp_stu, env0, raise_exp4); TEST2ARG_TWOFUN(1, infer2_dec, infer2_dec_stu, env2, val_dec1); TEST2ARG_TWOFUN(1, infer2_dec, infer2_dec_stu, env2, val_dec2); TEST2ARG_TWOFUN(1, infer2_dec, infer2_dec_stu, env2, val_dec3); TEST2ARG_TWOFUN(1, infer2_dec, infer2_dec_stu, env2, val_dec4); TEST2ARG_TWOFUN(1, infer2_dec, infer2_dec_stu, env2, val_dec5); TEST2ARG_TWOFUN(1, infer2_dec, infer2_dec_stu, env2, rec_dec1); TEST2ARG_TWOFUN(1, infer2_dec, infer2_dec_stu, env2, rec_dec2); TEST2ARG_TWOFUN(1, infer2_dec, infer2_dec_stu, env2, rec_dec3); TEST2ARG_TWOFUN(1, infer2_dec, infer2_dec_stu, env2, rec_dec4); TEST2ARG_TWOFUN(1, infer2_dec, infer2_dec_stu, env2, rec_dec5); TEST2ARG_TWOFUN(1, infer2_dec, infer2_dec_stu, env2, rec_dec6); TEST2ARG_TWOFUN(1, infer2_dec, infer2_dec_stu, env2, rec_dec7); TEST2ARG_TWOFUN(1, infer2_dec, infer2_dec_stu, env2, rec_dec8); TEST2ARG_TWOFUN(1, infer2_dec, infer2_dec_stu, env0, rec_dec3); TEST2ARG_TWOFUN(1, infer2_dec, infer2_dec_stu, env0, rec_dec8); TEST2ARG_TWOFUN(1, infer2_dec, infer2_dec_stu, env0, seq_dec1); TEST2ARG_TWOFUN(1, infer2_dec, infer2_dec_stu, env2, seq_dec2); TEST2ARG_TWOFUN(1, infer2_dec, infer2_dec_stu, env2, seq_dec3); TEST2ARG_TWOFUN(1, infer2_dec, infer2_dec_stu, env2, seq_dec4); TEST2ARG_TWOFUN(1, infer2_dec, infer2_dec_stu, env2, seq_dec5); TEST2ARG_TWOFUN(1, infer2_dec, infer2_dec_stu, env2, seq_dec6); TEST2ARG_TWOFUN(1, infer2_dec, infer2_dec_stu, env2, seq_dec7); TEST2ARG_TWOFUN(1, infer2_dec, infer2_dec_stu, env2, seq_dec8); TEST2ARG_TWOFUN(1, infer2_dec, infer2_dec_stu, env0, seq_dec2); TEST2ARG_TWOFUN(1, infer2_dec, infer2_dec_stu, env0, seq_dec8); TEST2ARG_TWOFUN(1, infer2_exp, infer2_exp_stu, env0, let_exp1); TEST2ARG_TWOFUN(1, infer2_exp, infer2_exp_stu, env2, let_exp2); TEST2ARG_TWOFUN(1, infer2_exp, infer2_exp_stu, env2, let_exp3); TEST2ARG_TWOFUN(1, infer2_exp, infer2_exp_stu, env2, let_exp4); TEST2ARG_TWOFUN(1, infer2_exp, infer2_exp_stu, env2, let_exp5); TEST2ARG_TWOFUN(1, infer2_exp, infer2_exp_stu, env2, let_exp6); TEST2ARG_TWOFUN(1, infer2_exp, infer2_exp_stu, env2, let_exp7); TEST2ARG_TWOFUN(1, infer2_exp, infer2_exp_stu, env2, let_exp8); TEST2ARG_TWOFUN(1, infer2_exp, infer2_exp_stu, env0, let_exp3); TEST2ARG_TWOFUN(1, infer2_exp, infer2_exp_stu, env0, let_exp8) ] (* This list is for extra credit problems *) let extra_rubric = [ TEST2ARG_TWOFUN(1, infer2_exp, infer2_exp_stu, env0, handle_exp1); TEST2ARG_TWOFUN(1, infer2_exp, infer2_exp_stu, env2, handle_exp2); TEST2ARG_TWOFUN(1, infer2_exp, infer2_exp_stu, env2, handle_exp3); TEST2ARG_TWOFUN(1, infer2_exp, infer2_exp_stu, env2, handle_exp4); TEST2ARG_TWOFUN(1, infer2_exp, infer2_exp_stu, env2, handle_exp5); TEST2ARG_TWOFUN(1, infer2_exp, infer2_exp_stu, env0, handle_exp5); TEST2ARG_TWOFUN(1, infer2_exp, infer2_exp_stu, env0, handle_exp2); TEST2ARG_TWOFUN(1, infer2_dec, infer2_dec_stu, env0, local_dec1); TEST2ARG_TWOFUN(1, infer2_dec, infer2_dec_stu, env2, local_dec1); TEST2ARG_TWOFUN(1, infer2_dec, infer2_dec_stu, env2, local_dec1); TEST2ARG_TWOFUN(1, infer2_dec, infer2_dec_stu, env2, local_dec1); TEST2ARG_TWOFUN(1, infer2_dec, infer2_dec_stu, env2, local_dec1) ]