refactor(library): move vm to a separate directory
This commit is contained in:
parent
7852247376
commit
399b83122c
15 changed files with 273 additions and 181 deletions
|
|
@ -350,6 +350,8 @@ set(LEAN_OBJS ${LEAN_OBJS} $<TARGET_OBJECTS:definitional>)
|
|||
# set(LEAN_OBJS ${LEAN_OBJS} $<TARGET_OBJECTS:simplifier>)
|
||||
# add_subdirectory(library/blast/forward)
|
||||
# set(LEAN_OBJS ${LEAN_OBJS} $<TARGET_OBJECTS:forward>)
|
||||
add_subdirectory(library/vm)
|
||||
set(LEAN_OBJS ${LEAN_OBJS} $<TARGET_OBJECTS:vm>)
|
||||
add_subdirectory(library/compiler)
|
||||
set(LEAN_OBJS ${LEAN_OBJS} $<TARGET_OBJECTS:compiler>)
|
||||
add_subdirectory(frontends/lean)
|
||||
|
|
|
|||
|
|
@ -18,6 +18,7 @@ Author: Leonardo de Moura
|
|||
// #include "library/tactic/init_module.h"
|
||||
#include "library/definitional/init_module.h"
|
||||
#include "library/print.h"
|
||||
#include "library/vm/init_module.h"
|
||||
#include "library/compiler/init_module.h"
|
||||
#include "frontends/lean/init_module.h"
|
||||
#include "init/init.h"
|
||||
|
|
@ -33,21 +34,27 @@ void initialize() {
|
|||
initialize_quotient_module();
|
||||
initialize_hits_module();
|
||||
init_default_print_fn();
|
||||
initialize_library_core_module();
|
||||
initialize_vm_core_module();
|
||||
initialize_library_module();
|
||||
initialize_compiler_module();
|
||||
// initialize_tactic_module();
|
||||
// initialize_blast_module();
|
||||
initialize_definitional_module();
|
||||
initialize_compiler_module();
|
||||
initialize_frontend_lean_module();
|
||||
initialize_vm_module();
|
||||
}
|
||||
void finalize() {
|
||||
run_thread_finalizers();
|
||||
finalize_vm_module();
|
||||
finalize_frontend_lean_module();
|
||||
finalize_compiler_module();
|
||||
finalize_definitional_module();
|
||||
// finalize_blast_module();
|
||||
// finalize_tactic_module();
|
||||
finalize_compiler_module();
|
||||
finalize_library_module();
|
||||
finalize_vm_core_module();
|
||||
finalize_library_core_module();
|
||||
finalize_hits_module();
|
||||
finalize_quotient_module();
|
||||
finalize_inductive_module();
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ add_library(library OBJECT deep_copy.cpp expr_lt.cpp io_state.cpp
|
|||
abstract_expr_manager.cpp light_lt_manager.cpp trace.cpp
|
||||
attribute_manager.cpp error_handling.cpp unification_hint.cpp defeq_simp_lemmas.cpp
|
||||
defeq_simplifier.cpp proof_irrel_expr_manager.cpp
|
||||
local_context.cpp metavar_context.cpp type_context.cpp vm.cpp
|
||||
local_context.cpp metavar_context.cpp type_context.cpp
|
||||
# Legacy -- The following files will be eventually deleted
|
||||
normalize.cpp justification.cpp constraint.cpp metavar.cpp choice.cpp locals.cpp
|
||||
unifier.cpp match.cpp class_instance_resolution.cpp old_type_context.cpp
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ Author: Leonardo de Moura
|
|||
#include "kernel/inductive/inductive.h"
|
||||
#include "library/normalize.h"
|
||||
#include "library/util.h"
|
||||
#include "library/vm.h"
|
||||
#include "library/vm/vm.h"
|
||||
#include "library/compiler/util.h"
|
||||
#include "library/compiler/erase_irrelevant.h"
|
||||
#include "library/compiler/compiler_step_visitor.h"
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ Author: Leonardo de Moura
|
|||
#include "kernel/inductive/inductive.h"
|
||||
#include "library/aux_recursors.h"
|
||||
#include "library/util.h"
|
||||
#include "library/vm.h"
|
||||
#include "library/vm/vm.h"
|
||||
#include "library/type_context.h"
|
||||
|
||||
namespace lean {
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@ Author: Leonardo de Moura
|
|||
#include "kernel/instantiate.h"
|
||||
#include "library/constants.h"
|
||||
#include "library/trace.h"
|
||||
#include "library/vm.h"
|
||||
#include "library/vm/vm.h"
|
||||
#include "library/util.h"
|
||||
#include "library/compiler/simp_inductive.h"
|
||||
#include "library/compiler/erase_irrelevant.h"
|
||||
|
|
|
|||
|
|
@ -6,7 +6,6 @@ Author: Leonardo de Moura
|
|||
*/
|
||||
#include "library/trace.h"
|
||||
#include "library/constants.h"
|
||||
#include "library/vm.h"
|
||||
#include "library/unifier.h"
|
||||
#include "library/kernel_serializer.h"
|
||||
#include "library/let.h"
|
||||
|
|
@ -60,11 +59,17 @@ Author: Leonardo de Moura
|
|||
|
||||
|
||||
namespace lean {
|
||||
void initialize_library_module() {
|
||||
void initialize_library_core_module() {
|
||||
initialize_constants();
|
||||
initialize_trace();
|
||||
initialize_vm();
|
||||
}
|
||||
|
||||
void finalize_library_core_module() {
|
||||
finalize_trace();
|
||||
finalize_constants();
|
||||
}
|
||||
|
||||
void initialize_library_module() {
|
||||
// TODO(Leo): delete legacy....
|
||||
initialize_old_converter();
|
||||
initialize_old_default_converter();
|
||||
|
|
@ -166,9 +171,6 @@ void finalize_library_module() {
|
|||
finalize_attribute_manager();
|
||||
finalize_metavar_context();
|
||||
finalize_local_context();
|
||||
finalize_vm();
|
||||
finalize_constants();
|
||||
finalize_trace();
|
||||
|
||||
// TODO(Leo): delete legacy....
|
||||
finalize_old_converter();
|
||||
|
|
|
|||
|
|
@ -7,6 +7,8 @@ Author: Leonardo de Moura
|
|||
#pragma once
|
||||
|
||||
namespace lean {
|
||||
void initialize_library_core_module();
|
||||
void finalize_library_core_module();
|
||||
void initialize_library_module();
|
||||
void finalize_library_module();
|
||||
}
|
||||
|
|
|
|||
1
src/library/vm/CMakeLists.txt
Normal file
1
src/library/vm/CMakeLists.txt
Normal file
|
|
@ -0,0 +1 @@
|
|||
add_library(vm OBJECT vm.cpp vm_nat.cpp init_module.cpp)
|
||||
26
src/library/vm/init_module.cpp
Normal file
26
src/library/vm/init_module.cpp
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
/*
|
||||
Copyright (c) 2016 Microsoft Corporation. All rights reserved.
|
||||
Released under Apache 2.0 license as described in the file LICENSE.
|
||||
|
||||
Author: Leonardo de Moura
|
||||
*/
|
||||
#include "library/vm/vm.h"
|
||||
#include "library/vm/vm_nat.h"
|
||||
|
||||
namespace lean {
|
||||
void initialize_vm_core_module() {
|
||||
initialize_vm_core();
|
||||
initialize_vm_nat();
|
||||
}
|
||||
void finalize_vm_core_module() {
|
||||
finalize_vm_nat();
|
||||
finalize_vm_core();
|
||||
}
|
||||
|
||||
void initialize_vm_module() {
|
||||
initialize_vm();
|
||||
}
|
||||
void finalize_vm_module() {
|
||||
finalize_vm();
|
||||
}
|
||||
}
|
||||
15
src/library/vm/init_module.h
Normal file
15
src/library/vm/init_module.h
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
/*
|
||||
Copyright (c) 2016 Microsoft Corporation. All rights reserved.
|
||||
Released under Apache 2.0 license as described in the file LICENSE.
|
||||
|
||||
Author: Leonardo de Moura
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
namespace lean {
|
||||
void initialize_vm_core_module();
|
||||
void finalize_vm_core_module();
|
||||
|
||||
void initialize_vm_module();
|
||||
void finalize_vm_module();
|
||||
}
|
||||
|
|
@ -8,7 +8,7 @@ Author: Leonardo de Moura
|
|||
#include "util/sstream.h"
|
||||
#include "util/parray.h"
|
||||
#include "library/constants.h"
|
||||
#include "library/vm.h"
|
||||
#include "library/vm/vm.h"
|
||||
|
||||
namespace lean {
|
||||
void vm_obj_cell::dec_ref(vm_obj & o, buffer<vm_obj_cell*> & todelete) {
|
||||
|
|
@ -532,183 +532,19 @@ void display_vm_code(std::ostream & out, environment const & env, unsigned code_
|
|||
}
|
||||
}
|
||||
|
||||
// =======================================
|
||||
// Builtin nat operations
|
||||
#define MAX_SMALL_NAT 1u<<31
|
||||
|
||||
vm_obj mk_vm_nat(unsigned n) {
|
||||
if (n < MAX_SMALL_NAT)
|
||||
return mk_vm_simple(n);
|
||||
else
|
||||
return mk_vm_mpz(mpz(n));
|
||||
void initialize_vm_core() {
|
||||
g_vm_builtins = new name_map<pair<unsigned, vm_function>>();
|
||||
}
|
||||
|
||||
vm_obj mk_vm_nat(mpz const & n) {
|
||||
if (n < MAX_SMALL_NAT)
|
||||
return mk_vm_simple(n.get_unsigned_int());
|
||||
else
|
||||
return mk_vm_mpz(n);
|
||||
}
|
||||
|
||||
MK_THREAD_LOCAL_GET_DEF(mpz, get_mpz1);
|
||||
MK_THREAD_LOCAL_GET_DEF(mpz, get_mpz2);
|
||||
|
||||
static mpz const & to_mpz1(vm_obj const & o) {
|
||||
if (is_simple(o)) {
|
||||
mpz & r = get_mpz1();
|
||||
r = cidx(o);
|
||||
return r;
|
||||
} else {
|
||||
return to_mpz(o);
|
||||
}
|
||||
}
|
||||
|
||||
static mpz const & to_mpz2(vm_obj const & o) {
|
||||
if (is_simple(o)) {
|
||||
mpz & r = get_mpz2();
|
||||
r = cidx(o);
|
||||
return r;
|
||||
} else {
|
||||
return to_mpz(o);
|
||||
}
|
||||
}
|
||||
|
||||
static void nat_succ(vm_state & s) {
|
||||
vm_obj const & a = s.get(0);
|
||||
if (is_simple(a)) {
|
||||
s.push(mk_vm_nat(cidx(a) + 1));
|
||||
} else {
|
||||
s.push(mk_vm_mpz(to_mpz1(a) + 1));
|
||||
}
|
||||
}
|
||||
|
||||
static void nat_add(vm_state & s) {
|
||||
vm_obj const & a1 = s.get(0);
|
||||
vm_obj const & a2 = s.get(1);
|
||||
if (is_simple(a1) && is_simple(a2)) {
|
||||
s.push(mk_vm_nat(cidx(a1) + cidx(a2)));
|
||||
} else {
|
||||
s.push(mk_vm_mpz(to_mpz1(a1) + to_mpz2(a2)));
|
||||
}
|
||||
}
|
||||
|
||||
static void nat_mul(vm_state & s) {
|
||||
vm_obj const & a1 = s.get(0);
|
||||
vm_obj const & a2 = s.get(1);
|
||||
if (is_simple(a1) && is_simple(a2)) {
|
||||
unsigned long long r = static_cast<unsigned long long>(cidx(a1)) + static_cast<unsigned long long>(cidx(a2));
|
||||
if (r < MAX_SMALL_NAT) {
|
||||
s.push(mk_vm_simple(r));
|
||||
return;
|
||||
}
|
||||
}
|
||||
s.push(mk_vm_mpz(to_mpz1(a1) * to_mpz2(a2)));
|
||||
}
|
||||
|
||||
static void nat_sub(vm_state & s) {
|
||||
vm_obj const & a1 = s.get(0);
|
||||
vm_obj const & a2 = s.get(1);
|
||||
if (is_simple(a1) && is_simple(a2)) {
|
||||
unsigned v1 = cidx(a1);
|
||||
unsigned v2 = cidx(a2);
|
||||
if (v2 > v1)
|
||||
s.push(mk_vm_simple(0));
|
||||
else
|
||||
s.push(mk_vm_nat(v1 - v2));
|
||||
} else {
|
||||
mpz const & v1 = to_mpz1(a1);
|
||||
mpz const & v2 = to_mpz2(a2);
|
||||
if (v2 > v1)
|
||||
s.push(mk_vm_simple(0));
|
||||
else
|
||||
s.push(mk_vm_nat(v1 - v2));
|
||||
}
|
||||
}
|
||||
|
||||
static void nat_div(vm_state & s) {
|
||||
vm_obj const & a1 = s.get(0);
|
||||
vm_obj const & a2 = s.get(1);
|
||||
if (is_simple(a1) && is_simple(a2)) {
|
||||
unsigned v1 = cidx(a1);
|
||||
unsigned v2 = cidx(a2);
|
||||
if (v2 == 0)
|
||||
s.push(mk_vm_simple(0));
|
||||
else
|
||||
s.push(mk_vm_nat(v1 / v2));
|
||||
} else {
|
||||
mpz const & v1 = to_mpz1(a1);
|
||||
mpz const & v2 = to_mpz2(a2);
|
||||
if (v2 == 0)
|
||||
s.push(mk_vm_simple(0));
|
||||
else
|
||||
s.push(mk_vm_nat(v1 / v2));
|
||||
}
|
||||
}
|
||||
|
||||
static void nat_mod(vm_state & s) {
|
||||
vm_obj const & a1 = s.get(0);
|
||||
vm_obj const & a2 = s.get(1);
|
||||
if (is_simple(a1) && is_simple(a2)) {
|
||||
unsigned v1 = cidx(a1);
|
||||
unsigned v2 = cidx(a2);
|
||||
if (v2 == 0)
|
||||
s.push(a1);
|
||||
else
|
||||
s.push(mk_vm_nat(v1 % v2));
|
||||
} else {
|
||||
mpz const & v1 = to_mpz1(a1);
|
||||
mpz const & v2 = to_mpz2(a2);
|
||||
if (v2 == 0)
|
||||
s.push(a1);
|
||||
else
|
||||
s.push(mk_vm_nat(v1 % v2));
|
||||
}
|
||||
}
|
||||
|
||||
static void nat_gcd(vm_state & s) {
|
||||
vm_obj const & a1 = s.get(0);
|
||||
vm_obj const & a2 = s.get(1);
|
||||
mpz r;
|
||||
gcd(r, to_mpz1(a1), to_mpz2(a2));
|
||||
s.push(mk_vm_nat(r));
|
||||
}
|
||||
|
||||
static void nat_has_decidable_eq(vm_state & s) {
|
||||
vm_obj const & a1 = s.get(0);
|
||||
vm_obj const & a2 = s.get(1);
|
||||
if (is_simple(a1) && is_simple(a2)) {
|
||||
return s.push(mk_vm_bool(cidx(a1) == cidx(a2)));
|
||||
} else {
|
||||
return s.push(mk_vm_bool(to_mpz1(a1) == to_mpz2(a2)));
|
||||
}
|
||||
}
|
||||
|
||||
static void nat_has_decidable_le(vm_state & s) {
|
||||
vm_obj const & a1 = s.get(0);
|
||||
vm_obj const & a2 = s.get(1);
|
||||
if (is_simple(a1) && is_simple(a2)) {
|
||||
return s.push(mk_vm_bool(cidx(a1) <= cidx(a2)));
|
||||
} else {
|
||||
return s.push(mk_vm_bool(to_mpz1(a1) <= to_mpz2(a2)));
|
||||
}
|
||||
void finalize_vm_core() {
|
||||
delete g_vm_builtins;
|
||||
}
|
||||
|
||||
void initialize_vm() {
|
||||
g_vm_builtins = new name_map<pair<unsigned, vm_function>>();
|
||||
declare_vm_builtin(get_nat_succ_name(), 1, nat_succ);
|
||||
declare_vm_builtin(get_nat_add_name(), 2, nat_add);
|
||||
declare_vm_builtin(get_nat_mul_name(), 2, nat_mul);
|
||||
declare_vm_builtin(get_nat_sub_name(), 2, nat_sub);
|
||||
declare_vm_builtin(get_nat_div_name(), 2, nat_div);
|
||||
declare_vm_builtin(get_nat_mod_name(), 2, nat_mod);
|
||||
declare_vm_builtin(get_nat_gcd_name(), 2, nat_gcd);
|
||||
declare_vm_builtin(get_nat_has_decidable_eq_name(), 2, nat_has_decidable_eq);
|
||||
declare_vm_builtin(get_nat_has_decidable_le_name(), 2, nat_has_decidable_le);
|
||||
g_ext = new vm_decls_reg();
|
||||
}
|
||||
|
||||
void finalize_vm() {
|
||||
delete g_ext;
|
||||
delete g_vm_builtins;
|
||||
}
|
||||
}
|
||||
|
|
@ -430,6 +430,9 @@ optional<vm_decl> get_vm_decl(environment const & env, name const & n);
|
|||
|
||||
void display_vm_code(std::ostream & out, environment const & env, unsigned code_sz, vm_instr const * code);
|
||||
|
||||
void initialize_vm_core();
|
||||
void finalize_vm_core();
|
||||
|
||||
void initialize_vm();
|
||||
void finalize_vm();
|
||||
}
|
||||
186
src/library/vm/vm_nat.cpp
Normal file
186
src/library/vm/vm_nat.cpp
Normal file
|
|
@ -0,0 +1,186 @@
|
|||
/*
|
||||
Copyright (c) 2016 Microsoft Corporation. All rights reserved.
|
||||
Released under Apache 2.0 license as described in the file LICENSE.
|
||||
|
||||
Author: Leonardo de Moura
|
||||
*/
|
||||
#include "library/constants.h"
|
||||
#include "library/vm/vm.h"
|
||||
|
||||
namespace lean {
|
||||
// =======================================
|
||||
// Builtin nat operations
|
||||
#define MAX_SMALL_NAT 1u<<31
|
||||
|
||||
vm_obj mk_vm_nat(unsigned n) {
|
||||
if (n < MAX_SMALL_NAT)
|
||||
return mk_vm_simple(n);
|
||||
else
|
||||
return mk_vm_mpz(mpz(n));
|
||||
}
|
||||
|
||||
vm_obj mk_vm_nat(mpz const & n) {
|
||||
if (n < MAX_SMALL_NAT)
|
||||
return mk_vm_simple(n.get_unsigned_int());
|
||||
else
|
||||
return mk_vm_mpz(n);
|
||||
}
|
||||
|
||||
MK_THREAD_LOCAL_GET_DEF(mpz, get_mpz1);
|
||||
MK_THREAD_LOCAL_GET_DEF(mpz, get_mpz2);
|
||||
|
||||
static mpz const & to_mpz1(vm_obj const & o) {
|
||||
if (is_simple(o)) {
|
||||
mpz & r = get_mpz1();
|
||||
r = cidx(o);
|
||||
return r;
|
||||
} else {
|
||||
return to_mpz(o);
|
||||
}
|
||||
}
|
||||
|
||||
static mpz const & to_mpz2(vm_obj const & o) {
|
||||
if (is_simple(o)) {
|
||||
mpz & r = get_mpz2();
|
||||
r = cidx(o);
|
||||
return r;
|
||||
} else {
|
||||
return to_mpz(o);
|
||||
}
|
||||
}
|
||||
|
||||
static void nat_succ(vm_state & s) {
|
||||
vm_obj const & a = s.get(0);
|
||||
if (is_simple(a)) {
|
||||
s.push(mk_vm_nat(cidx(a) + 1));
|
||||
} else {
|
||||
s.push(mk_vm_mpz(to_mpz1(a) + 1));
|
||||
}
|
||||
}
|
||||
|
||||
static void nat_add(vm_state & s) {
|
||||
vm_obj const & a1 = s.get(0);
|
||||
vm_obj const & a2 = s.get(1);
|
||||
if (is_simple(a1) && is_simple(a2)) {
|
||||
s.push(mk_vm_nat(cidx(a1) + cidx(a2)));
|
||||
} else {
|
||||
s.push(mk_vm_mpz(to_mpz1(a1) + to_mpz2(a2)));
|
||||
}
|
||||
}
|
||||
|
||||
static void nat_mul(vm_state & s) {
|
||||
vm_obj const & a1 = s.get(0);
|
||||
vm_obj const & a2 = s.get(1);
|
||||
if (is_simple(a1) && is_simple(a2)) {
|
||||
unsigned long long r = static_cast<unsigned long long>(cidx(a1)) + static_cast<unsigned long long>(cidx(a2));
|
||||
if (r < MAX_SMALL_NAT) {
|
||||
s.push(mk_vm_simple(r));
|
||||
return;
|
||||
}
|
||||
}
|
||||
s.push(mk_vm_mpz(to_mpz1(a1) * to_mpz2(a2)));
|
||||
}
|
||||
|
||||
static void nat_sub(vm_state & s) {
|
||||
vm_obj const & a1 = s.get(0);
|
||||
vm_obj const & a2 = s.get(1);
|
||||
if (is_simple(a1) && is_simple(a2)) {
|
||||
unsigned v1 = cidx(a1);
|
||||
unsigned v2 = cidx(a2);
|
||||
if (v2 > v1)
|
||||
s.push(mk_vm_simple(0));
|
||||
else
|
||||
s.push(mk_vm_nat(v1 - v2));
|
||||
} else {
|
||||
mpz const & v1 = to_mpz1(a1);
|
||||
mpz const & v2 = to_mpz2(a2);
|
||||
if (v2 > v1)
|
||||
s.push(mk_vm_simple(0));
|
||||
else
|
||||
s.push(mk_vm_nat(v1 - v2));
|
||||
}
|
||||
}
|
||||
|
||||
static void nat_div(vm_state & s) {
|
||||
vm_obj const & a1 = s.get(0);
|
||||
vm_obj const & a2 = s.get(1);
|
||||
if (is_simple(a1) && is_simple(a2)) {
|
||||
unsigned v1 = cidx(a1);
|
||||
unsigned v2 = cidx(a2);
|
||||
if (v2 == 0)
|
||||
s.push(mk_vm_simple(0));
|
||||
else
|
||||
s.push(mk_vm_nat(v1 / v2));
|
||||
} else {
|
||||
mpz const & v1 = to_mpz1(a1);
|
||||
mpz const & v2 = to_mpz2(a2);
|
||||
if (v2 == 0)
|
||||
s.push(mk_vm_simple(0));
|
||||
else
|
||||
s.push(mk_vm_nat(v1 / v2));
|
||||
}
|
||||
}
|
||||
|
||||
static void nat_mod(vm_state & s) {
|
||||
vm_obj const & a1 = s.get(0);
|
||||
vm_obj const & a2 = s.get(1);
|
||||
if (is_simple(a1) && is_simple(a2)) {
|
||||
unsigned v1 = cidx(a1);
|
||||
unsigned v2 = cidx(a2);
|
||||
if (v2 == 0)
|
||||
s.push(a1);
|
||||
else
|
||||
s.push(mk_vm_nat(v1 % v2));
|
||||
} else {
|
||||
mpz const & v1 = to_mpz1(a1);
|
||||
mpz const & v2 = to_mpz2(a2);
|
||||
if (v2 == 0)
|
||||
s.push(a1);
|
||||
else
|
||||
s.push(mk_vm_nat(v1 % v2));
|
||||
}
|
||||
}
|
||||
|
||||
static void nat_gcd(vm_state & s) {
|
||||
vm_obj const & a1 = s.get(0);
|
||||
vm_obj const & a2 = s.get(1);
|
||||
mpz r;
|
||||
gcd(r, to_mpz1(a1), to_mpz2(a2));
|
||||
s.push(mk_vm_nat(r));
|
||||
}
|
||||
|
||||
static void nat_has_decidable_eq(vm_state & s) {
|
||||
vm_obj const & a1 = s.get(0);
|
||||
vm_obj const & a2 = s.get(1);
|
||||
if (is_simple(a1) && is_simple(a2)) {
|
||||
return s.push(mk_vm_bool(cidx(a1) == cidx(a2)));
|
||||
} else {
|
||||
return s.push(mk_vm_bool(to_mpz1(a1) == to_mpz2(a2)));
|
||||
}
|
||||
}
|
||||
|
||||
static void nat_has_decidable_le(vm_state & s) {
|
||||
vm_obj const & a1 = s.get(0);
|
||||
vm_obj const & a2 = s.get(1);
|
||||
if (is_simple(a1) && is_simple(a2)) {
|
||||
return s.push(mk_vm_bool(cidx(a1) <= cidx(a2)));
|
||||
} else {
|
||||
return s.push(mk_vm_bool(to_mpz1(a1) <= to_mpz2(a2)));
|
||||
}
|
||||
}
|
||||
|
||||
void initialize_vm_nat() {
|
||||
declare_vm_builtin(get_nat_succ_name(), 1, nat_succ);
|
||||
declare_vm_builtin(get_nat_add_name(), 2, nat_add);
|
||||
declare_vm_builtin(get_nat_mul_name(), 2, nat_mul);
|
||||
declare_vm_builtin(get_nat_sub_name(), 2, nat_sub);
|
||||
declare_vm_builtin(get_nat_div_name(), 2, nat_div);
|
||||
declare_vm_builtin(get_nat_mod_name(), 2, nat_mod);
|
||||
declare_vm_builtin(get_nat_gcd_name(), 2, nat_gcd);
|
||||
declare_vm_builtin(get_nat_has_decidable_eq_name(), 2, nat_has_decidable_eq);
|
||||
declare_vm_builtin(get_nat_has_decidable_le_name(), 2, nat_has_decidable_le);
|
||||
}
|
||||
|
||||
void finalize_vm_nat() {
|
||||
}
|
||||
}
|
||||
12
src/library/vm/vm_nat.h
Normal file
12
src/library/vm/vm_nat.h
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
/*
|
||||
Copyright (c) 2016 Microsoft Corporation. All rights reserved.
|
||||
Released under Apache 2.0 license as described in the file LICENSE.
|
||||
|
||||
Author: Leonardo de Moura
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
namespace lean {
|
||||
void initialize_vm_nat();
|
||||
void finalize_vm_nat();
|
||||
}
|
||||
Loading…
Add table
Reference in a new issue