equal
deleted
inserted
replaced
8 |
8 |
9 MiniML = Type + |
9 MiniML = Type + |
10 |
10 |
11 (* expressions *) |
11 (* expressions *) |
12 datatype |
12 datatype |
13 expr = Var nat | Abs expr | App expr expr |
13 expr = Var nat | Abs expr | App expr expr |
14 |
14 |
15 (* type inference rules *) |
15 (* type inference rules *) |
16 consts |
16 consts |
17 has_type :: "(typ list * expr * typ)set" |
17 has_type :: "(typ list * expr * typ)set" |
18 syntax |
18 syntax |
19 "@has_type" :: [typ list, expr, typ] => bool |
19 "@has_type" :: [typ list, expr, typ] => bool |
20 ("((_) |-/ (_) :: (_))" 60) |
20 ("((_) |-/ (_) :: (_))" 60) |
21 translations |
21 translations |
22 "a |- e :: t" == "(a,e,t):has_type" |
22 "a |- e :: t" == "(a,e,t):has_type" |
23 |
23 |
24 inductive "has_type" |
24 inductive "has_type" |
25 intrs |
25 intrs |
26 VarI "[| n < length a |] ==> a |- Var n :: nth n a" |
26 VarI "[| n < length a |] ==> a |- Var n :: nth n a" |
27 AbsI "[| t1#a |- e :: t2 |] ==> a |- Abs e :: t1 -> t2" |
27 AbsI "[| t1#a |- e :: t2 |] ==> a |- Abs e :: t1 -> t2" |
28 AppI "[| a |- e1 :: t2 -> t1; a |- e2 :: t2 |] |
28 AppI "[| a |- e1 :: t2 -> t1; a |- e2 :: t2 |] |
29 ==> a |- App e1 e2 :: t1" |
29 ==> a |- App e1 e2 :: t1" |
30 |
30 |
31 end |
31 end |
32 |
32 |