summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/lem_interp/interp_lib.lem15
-rw-r--r--src/type_internal.ml6
2 files changed, 20 insertions, 1 deletions
diff --git a/src/lem_interp/interp_lib.lem b/src/lem_interp/interp_lib.lem
index 141dd6f4..f7b29a33 100644
--- a/src/lem_interp/interp_lib.lem
+++ b/src/lem_interp/interp_lib.lem
@@ -846,8 +846,21 @@ let mask direction v =
| _ -> fail ()
end
+let s_append v =
+ let fail () = Assert_extra.failwith ("append given unexpected " ^ (string_of_value v)) in
+ match v with
+ | (V_tuple [l1;l2]) ->
+ retaint v (match (detaint l1,detaint l2) with
+ | (V_list vs1, V_list vs2) -> V_list (vs1++vs2)
+ | (V_unknown, _) -> V_unknown
+ | (_,V_unknown) -> V_unknown
+ | _ -> fail () end)
+ | _ -> fail ()
+end
+
let library_functions direction = [
- ("ignore", ignore_sail);
+ ("ignore", ignore_sail);
+ ("append", s_append);
("length", v_length);
("add", arith_op (+));
("add_vec", arith_op_vec (+) Unsigned 1);
diff --git a/src/type_internal.ml b/src/type_internal.ml
index 4f232ca6..285c1ad6 100644
--- a/src/type_internal.ml
+++ b/src/type_internal.ml
@@ -1959,6 +1959,12 @@ let initial_typ_env =
Constructor 2,[],pure_e,pure_e,nob));
("None", Base((["a", {k=K_Typ}], mk_pure_fun unit_t {t=Tapp("option", [TA_typ {t=Tvar "a"}])}),
Constructor 2,[],pure_e,pure_e,nob));
+ ("append",
+ lib_tannot
+ (["a",{k=K_Typ}], mk_pure_fun (mk_tup [{t=Tapp("list", [TA_typ {t=Tvar "a"}])};
+ {t=Tapp("list", [TA_typ {t=Tvar "a"}])}])
+ {t=Tapp("list",[TA_typ {t=Tvar "a"}])})
+ None []);
("most_significant", lib_tannot ((mk_nat_params ["n";"m"]@(mk_ord_params ["ord"])),
(mk_pure_fun (mk_vector bit_t (mk_ovar "ord") (mk_nv "n") (mk_nv "m")) bit_t))
None []);