示例#1
0
    def test_bool(self):
        self.assertEqual(systemf_eval("true"), (TyBool(), TmTrue()))
        self.assertEqual(systemf_eval("false"), (TyBool(), TmFalse()))
        self.assertEqual(systemf_eval("(\\x:Bool x)"),
                        (TyArr(TyBool(), TyBool()),
                         TmAbs('x', TyBool(), TmVar(0, 'x'))))
        self.assertEqual(systemf_eval("if true then false else true"),
                        (TyBool(), TmFalse()))
        self.assertEqual(systemf_eval("(\\x:Bool x) true"),
                        (TyBool(), TmTrue()))
        self.assertEqual(systemf_eval("(\\x:Bool->Bool x true) (\\x:Bool x)"),
                        (TyBool(), TmTrue()))
        self.assertEqual(systemf_eval("(\\x:Bool->Bool (\y:Bool x y)) (\\x:Bool x)"),
                        (TyArr(TyBool(), TyBool()),
                         TmAbs('y', TyBool(), TmApp(TmAbs('x', TyBool(), TmVar(1, 'x')),
                                                    TmVar(0, 'y')))))

        longcase1 = "(\\x:Bool->Bool->Bool x (\\y:Bool y)) (\\z:Bool->Bool z true)"
        self.assertEqual(systemf_eval(longcase1), (TyBool(), TmTrue()))

        longcase2 = "(\\x:Bool->Bool  (\\y:Bool x y) true) (\\x:Bool (\\y:Bool x) x)"
        self.assertEqual(systemf_eval(longcase2), (TyBool(), TmTrue()))

        longcase3 = "(\\x:Bool->Bool (\\y:Bool (\\z:Bool x y))) (\\x:Bool x) true true"
        self.assertEqual(systemf_eval(longcase3), (TyBool(), TmTrue()))
示例#2
0
    def test_subtype(self):
        self.assertEqual(systemf_eval("(\\x:{y:Bool} x.y) {y=true, z=false}"),
                         (TyBool(), TmTrue()))
        self.assertEqual(systemf_eval("(\\x:Top x) true"),
                         (TyTop(), TmTrue()))

        longcase1 = "(\\x:{y:Bool} -> {z:Bool} x {y=true}) (\\x:Top {y=true, z=false})"
        self.assertEqual(systemf_eval(longcase1),
                         (TyRcd({'z':TyBool()}),
                          TmRcd({'y':TmTrue(), 'z':TmFalse()})))
示例#3
0
 def test_record(self):
     self.assertEqual(systemf_eval("{x=true, y=\\a:Bool a}.y true"),
                      (TyBool(), TmTrue()))
     self.assertEqual(systemf_eval("{x=true, y={z=\\a:Bool a}}.y.z true"),
                      (TyBool(), TmTrue()))
     self.assertEqual(systemf_eval("{x=true, y=\\a:Bool a}"),
                      (TyRcd({'x':TyBool(), 'y':TyArr(TyBool(), TyBool())}),
                       TmRcd({'x':TmTrue(), 'y':TmAbs('a', TyBool(), TmVar(0, 'a'))})))
     self.assertEqual(systemf_eval("(\\x:{y:Bool} x.y) {y=true}"),
                      (TyBool(), TmTrue()))
     self.assertEqual(systemf_eval("(\\X (\\x:{y:X} x.y)) [Bool] {y=true}"),
                      (TyBool(), TmTrue()))
示例#4
0
    def test_join_meet(self):
        longcase1 = "if true then {x=true, y=false} else {y=true, z=true}"
        self.assertEqual(systemf_eval(longcase1),
                         (TyRcd({'y':TyBool()}),
                          TmRcd({'x':TmTrue(), 'y':TmFalse()})))

        longcase2 = "if true then (\\x:{y:Bool} {z=true}) \
                     else (\\x:{w:Bool} {a=true, z=x.w})"
        self.assertEqual(systemf_eval(longcase2),
                         (TyArr(TyRcd({'y':TyBool(), 'w':TyBool()}),
                                TyRcd({'z':TyBool()})),
                          TmAbs('x', TyRcd({'y':TyBool()}), TmRcd({'z':TmTrue()}))))

        longcase3 = "(\\x:{y:{z:Bool}} x.y.z) {y={z=true, w=false}}"
        self.assertEqual(systemf_eval(longcase3),
                         (TyBool(), TmTrue()))
示例#5
0
文件: main.py 项目: yu-i9/SystemF
def driver_loop():
    while(1):
        try:
            expr = input("> ")
            (res, ty) = execute.systemf_eval(expr)
            print("{0} :: {1}".format(ty, res))
        except subprocess.CalledProcessError as err:
            pass
        except typing.TypingError as err:
            print("type error : " + str(err.args))
        except KeyboardInterrupt:
            print("exit")
            break
示例#6
0
 def test_polymorphism(self):
     self.assertEqual(systemf_eval("(\\X (\\x:X x)) [Bool] true"),
                     (TyBool(), TmTrue()))
     self.assertEqual(systemf_eval("(\\X (\\Y (\\x:Y x)) [X->X]) [Bool] (\\x:Bool x)"),
                     (TyArr(TyBool(), TyBool()), TmAbs('x', TyBool(), TmVar(0, 'x'))))