summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian Campbell2018-04-04 12:05:56 +0100
committerBrian Campbell2018-04-04 14:45:00 +0100
commit48f38c64fb68208d0b245f15ec2a3453ed00690f (patch)
tree4feecabfeae990fd368c98cdccdaf340b6e911ca
parent6d4d2b46f013e425af4f6c089fd224c9e811f761 (diff)
Make Type_check.solve do obvious cases immediately
-rw-r--r--src/type_check.ml33
1 files changed, 18 insertions, 15 deletions
diff --git a/src/type_check.ml b/src/type_check.ml
index 9db1f417..cc88c159 100644
--- a/src/type_check.ml
+++ b/src/type_check.ml
@@ -1174,21 +1174,24 @@ let prove_z3 env nc =
let solve env nexp =
typ_print ("Solve " ^ string_of_list ", " string_of_n_constraint (Env.get_constraints env) ^ " |- " ^ string_of_nexp nexp ^ " = ?");
- let bindings = ref KBindings.empty in
- let fresh_var kid =
- let n = KBindings.cardinal !bindings in
- bindings := KBindings.add kid n !bindings;
- n
- in
- let var_of kid =
- try KBindings.find kid !bindings with
- | Not_found -> fresh_var kid
- in
- let env = Env.add_typ_var (mk_kid "solve#") BK_nat env in
- let constr = Constraint.conj (nc_constraints env var_of (Env.get_constraints env))
- (nc_constraint env var_of (nc_eq (nvar (mk_kid "solve#")) nexp))
- in
- Constraint.solve_z3 constr (var_of (mk_kid "solve#"))
+ match nexp with
+ | Nexp_aux (Nexp_constant n,_) -> Some n
+ | _ ->
+ let bindings = ref KBindings.empty in
+ let fresh_var kid =
+ let n = KBindings.cardinal !bindings in
+ bindings := KBindings.add kid n !bindings;
+ n
+ in
+ let var_of kid =
+ try KBindings.find kid !bindings with
+ | Not_found -> fresh_var kid
+ in
+ let env = Env.add_typ_var (mk_kid "solve#") BK_nat env in
+ let constr = Constraint.conj (nc_constraints env var_of (Env.get_constraints env))
+ (nc_constraint env var_of (nc_eq (nvar (mk_kid "solve#")) nexp))
+ in
+ Constraint.solve_z3 constr (var_of (mk_kid "solve#"))
let prove env (NC_aux (nc_aux, _) as nc) =
let compare_const f (Nexp_aux (n1, _)) (Nexp_aux (n2, _)) =