lean2/src/builtin/lean2h.lean
Leonardo de Moura dbc100cc2e feat(library/simplifier): cast elimination in the simplifier
Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>
2014-01-23 17:28:14 -08:00

71 lines
2.3 KiB
Text

(*
-- Auxiliary script for generating .h file that declare mk_* and is_* functions for
-- constants defined in Lean
local env = get_environment()
local num_imports = 0
print('/*')
print('Copyright (c) 2013 Microsoft Corporation. All rights reserved.')
print('Released under Apache 2.0 license as described in the file LICENSE.')
print('*/')
print("// Automatically generated file, DO NOT EDIT")
print('#include "kernel/expr.h"')
print('namespace lean {')
for obj in env:objects() do
if obj:is_begin_import() or obj:is_begin_builtin_import() then
num_imports = num_imports + 1
elseif obj:is_end_import() then
num_imports = num_imports - 1
elseif num_imports == 0 and obj:has_name() and obj:has_type() and not is_explicit(env, obj:get_name()) and not obj:is_builtin() then
local ty = env:normalize(obj:get_type())
local is_fn = ty:is_pi()
local arity = 0
while ty:is_pi() do
n, d, ty = ty:fields()
arity = arity + 1
end
local is_th = obj:is_theorem() or obj:is_axiom()
io.write("expr mk_")
name_to_cpp_decl(obj:get_name())
if is_fn then
io.write("_fn");
end
print("();")
io.write("bool is_")
name_to_cpp_decl(obj:get_name())
if is_fn then
io.write("_fn");
end
print("(expr const & e);")
if is_fn and not is_th then
io.write("inline bool is_")
name_to_cpp_decl(obj:get_name())
io.write("(expr const & e) { return is_app(e) && is_");
name_to_cpp_decl(obj:get_name())
print("_fn(arg(e, 0)) && num_args(e) == " .. (arity+1) .. "; }")
end
if is_fn then
io.write("inline expr mk_")
name_to_cpp_decl(obj:get_name())
if is_th then
io.write("_th");
end
io.write("(");
for i = 1, arity do
if i > 1 then
io.write(", ")
end
io.write("expr const & e" .. tostring(i))
end
io.write(") { return mk_app({mk_");
name_to_cpp_decl(obj:get_name())
io.write("_fn()")
for i = 1, arity do
io.write(", e" .. tostring(i))
end
print ("}); }")
end
end
end
print('}')
*)