feat(library): numeral normalization skeleton

This commit is contained in:
Leonardo de Moura 2015-10-08 12:49:12 -07:00
parent 5f967f40b2
commit e4f0f6a9b4
10 changed files with 151 additions and 2 deletions

View file

@ -0,0 +1,23 @@
import algebra.ring -- has_add, has_one, ... will be moved to init in the future
open algebra
variable {A : Type}
definition zero [s : has_zero A] : A :=
has_zero.zero A
definition one [s : has_one A] : A :=
has_one.one A
definition add [s : has_add A] : A → A → A :=
has_add.add
definition bit0 [s : has_add A] (a : A) : A :=
add a a
definition bit1 [s₁ : has_add A] [s₂ : has_one A] (a : A) : A :=
add (add a a) one
-- variables [s : ring A]
-- set_option pp.all true
-- check bit1 (bit0 (one : A))

View file

@ -46,6 +46,7 @@ definition congruence : tactic := builtin
definition rotate_left (k : num) := builtin
definition rotate_right (k : num) := builtin
definition rotate (k : num) := rotate_left k
definition norm_num : tactic := builtin
-- This is just a trick to embed expressions into tactics.
-- The nested expressions are "raw". They tactic should

View file

@ -15,4 +15,4 @@ add_library(library OBJECT deep_copy.cpp expr_lt.cpp io_state.cpp occurs.cpp
unfold_macros.cpp app_builder.cpp projection.cpp abbreviation.cpp
relation_manager.cpp export.cpp user_recursors.cpp
class_instance_synth.cpp idx_metavar.cpp composition_manager.cpp
tc_multigraph.cpp noncomputable.cpp aux_recursors.cpp)
tc_multigraph.cpp noncomputable.cpp aux_recursors.cpp norm_num.cpp)

18
src/library/norm_num.cpp Normal file
View file

@ -0,0 +1,18 @@
/*
Copyright (c) 2015 Microsoft Corporation. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Author: Rob Lewis
*/
#include "library/norm_num.h"
namespace lean {
bool norm_num_context::is_numeral(expr const &) const {
// TODO(Rob)
return false;
}
pair<expr, expr> norm_num_context::mk_norm(expr const &) {
// TODO(Rob)
throw exception("not implemented yet - norm_num`");
}
}

27
src/library/norm_num.h Normal file
View file

@ -0,0 +1,27 @@
/*
Copyright (c) 2015 Microsoft Corporation. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Author: Rob Lewis
*/
#pragma once
#include "kernel/environment.h"
namespace lean {
class norm_num_context {
environment m_env;
public:
norm_num_context(environment const & env):m_env(env) {}
bool is_numeral(expr const & e) const;
pair<expr, expr> mk_norm(expr const & e);
};
inline bool is_numeral(environment const & env, expr const & e) {
return norm_num_context(env).is_numeral(e);
}
inline pair<expr, expr> mk_norm_num(environment const & env, expr const & e) {
return norm_num_context(env).mk_norm(e);
}
}

View file

@ -6,4 +6,5 @@ expr_to_tactic.cpp location.cpp rewrite_tactic.cpp util.cpp
init_module.cpp change_tactic.cpp check_expr_tactic.cpp let_tactic.cpp
contradiction_tactic.cpp exfalso_tactic.cpp constructor_tactic.cpp
injection_tactic.cpp congruence_tactic.cpp relation_tactics.cpp
induction_tactic.cpp subst_tactic.cpp unfold_rec.cpp with_options_tactic.cpp)
induction_tactic.cpp subst_tactic.cpp unfold_rec.cpp with_options_tactic.cpp
norm_num_tactic.cpp)

View file

@ -32,6 +32,7 @@ Author: Leonardo de Moura
#include "library/tactic/subst_tactic.h"
#include "library/tactic/location.h"
#include "library/tactic/with_options_tactic.h"
#include "library/tactic/norm_num_tactic.h"
namespace lean {
void initialize_tactic_module() {
@ -62,9 +63,11 @@ void initialize_tactic_module() {
initialize_subst_tactic();
initialize_location();
initialize_with_options_tactic();
initialize_norm_num_tactic();
}
void finalize_tactic_module() {
finalize_norm_num_tactic();
finalize_with_options_tactic();
finalize_location();
finalize_subst_tactic();

View file

@ -0,0 +1,53 @@
/*
Copyright (c) 2015 Microsoft Corporation. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Author: Rob Lewis
*/
#include "library/util.h"
#include "library/norm_num.h"
#include "library/tactic/expr_to_tactic.h"
namespace lean {
tactic norm_num_tactic() {
return tactic01([=](environment const & env, io_state const &, proof_state const & s) {
goals const & gs = s.get_goals();
if (empty(gs)) {
throw_no_goal_if_enabled(s);
return none_proof_state();
}
goal const & g = head(gs);
expr const & c = g.get_type();
expr lhs, rhs;
if (!is_eq(c, lhs, rhs)) {
throw_tactic_exception_if_enabled(s, "norm_num tactic failed, conclusion is not an equality");
return none_proof_state();
}
try {
pair<expr, expr> p = mk_norm_num(env, lhs);
expr new_lhs = p.first;
expr new_pr = p.second;
if (new_lhs != rhs) {
throw_tactic_exception_if_enabled(s, "norm_num tactic failed, lhs normal form doesn't match rhs");
return none_proof_state();
}
substitution new_subst = s.get_subst();
assign(new_subst, g, new_pr);
return some_proof_state(proof_state(s, tail(gs), new_subst));
} catch (exception & ex) {
throw_tactic_exception_if_enabled(s, ex.what());
return none_proof_state();
}
});
}
void initialize_norm_num_tactic() {
register_tac(name{"tactic", "norm_num"},
[](type_checker &, elaborate_fn const &, expr const &, pos_info_provider const *) {
return norm_num_tactic();
});
}
void finalize_norm_num_tactic() {
}
}

View file

@ -0,0 +1,12 @@
/*
Copyright (c) 2015 Microsoft Corporation. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Author: Rob Lewis
*/
#pragma once
namespace lean {
void initialize_norm_num_tactic();
void finalize_norm_num_tactic();
}

View file

@ -0,0 +1,11 @@
import algebra.numeral algebra.ring
open algebra
variable {A : Type}
variable [s : ring A]
include s
example : add (bit0 (one:A)) one = bit1 one :=
begin
norm_num
end