summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--backends/lean/Base/Primitives/Base.lean4
-rw-r--r--compiler/ExtractBuiltin.ml25
-rw-r--r--tests/lean/External/FunsExternal_Template.lean6
3 files changed, 29 insertions, 6 deletions
diff --git a/backends/lean/Base/Primitives/Base.lean b/backends/lean/Base/Primitives/Base.lean
index 4c5b2795..94134d86 100644
--- a/backends/lean/Base/Primitives/Base.lean
+++ b/backends/lean/Base/Primitives/Base.lean
@@ -130,6 +130,10 @@ def Result.attach {α: Type} (o : Result α): Result { x : α // o = ok x } :=
----------
@[simp] def core.mem.replace (a : Type) (x : a) (_ : a) : a × a := (x, x)
+/- [core::option::Option::take] -/
+@[simp] def Option.take (T: Type) (self: Option T): Option T × Option T := (self, .none)
+/- [core::mem::swap] -/
+@[simp] def core.mem.swap (T: Type) (a b: T): T × T := (b, a)
/-- Aeneas-translated function -- useful to reduce non-recursive definitions.
Use with `simp [ aeneas ]` -/
diff --git a/compiler/ExtractBuiltin.ml b/compiler/ExtractBuiltin.ml
index a9b939b5..c6827bbe 100644
--- a/compiler/ExtractBuiltin.ml
+++ b/compiler/ExtractBuiltin.ml
@@ -47,6 +47,10 @@ let flatten_name (name : string list) : string =
| FStar | Coq | HOL4 -> String.concat "_" name
| Lean -> String.concat "." name
+(** Utility for Lean-only definitions **)
+let mk_lean_only (funs : 'a list) : 'a list =
+ match !backend with Lean -> funs | _ -> []
+
let () =
assert (split_on_separator "x::y::z" = [ "x"; "y"; "z" ]);
assert (split_on_separator "x.y.z" = [ "x"; "y"; "z" ])
@@ -438,6 +442,21 @@ let builtin_funs () : (pattern * bool list option * builtin_fun_info) list =
(fun ty -> "core::clone::impls::{core::clone::Clone<" ^ ty ^ ">}::clone")
(fun ty ->
"core.clone.Clone" ^ StringUtils.capitalize_first_letter ty ^ ".clone")
+ (* Lean-only definitions *)
+ @ mk_lean_only
+ [
+ (* `backend_choice` first parameter is for non-Lean backends
+ By construction, we cannot write down that parameter in the output
+ in this list
+ *)
+ mk_fun "core::mem::swap" None None;
+ mk_fun "core::option::{core::option::Option<@T>}::take"
+ (Some (backend_choice "" "Option::take"))
+ None;
+ mk_fun "core::option::{core::option::Option<@T>}::is_none"
+ (Some (backend_choice "" "Option::isNone"))
+ (Some [ false ]);
+ ]
let mk_builtin_funs_map () =
let m =
@@ -521,6 +540,12 @@ let builtin_fun_effects =
"alloc::vec::{core::ops::deref::Deref<alloc::vec::Vec<@T, @A>>}::deref";
]
@ int_funs
+ @ mk_lean_only
+ [
+ "core::mem::swap";
+ "core::option::{core::option::Option<@T>}::take";
+ "core::option::{core::option::Option<@T>}::is_none";
+ ]
in
let no_fail_no_state_funs =
List.map
diff --git a/tests/lean/External/FunsExternal_Template.lean b/tests/lean/External/FunsExternal_Template.lean
index 38151dc9..f0e771f7 100644
--- a/tests/lean/External/FunsExternal_Template.lean
+++ b/tests/lean/External/FunsExternal_Template.lean
@@ -6,12 +6,6 @@ import External.Types
open Primitives
open external
-/- [core::mem::swap]:
- Source: '/rustc/d59363ad0b6391b7fc5bbb02c9ccf9300eef3753/library/core/src/mem/mod.rs', lines 726:0-726:42
- Name pattern: core::mem::swap -/
-axiom core.mem.swap
- (T : Type) : T → T → State → Result (State × (T × T))
-
/- [core::num::nonzero::{core::num::nonzero::NonZeroU32#14}::new]:
Source: '/rustc/d59363ad0b6391b7fc5bbb02c9ccf9300eef3753/library/core/src/num/nonzero.rs', lines 79:16-79:57
Name pattern: core::num::nonzero::{core::num::nonzero::NonZeroU32}::new -/