feat(library/init/meta/comp_value_tactics): add comp_val tactic for testing

This commit is contained in:
Leonardo de Moura 2016-11-22 17:03:21 -08:00
parent 357b9adefc
commit 242ad1bd65
5 changed files with 262 additions and 3 deletions

View file

@ -0,0 +1,42 @@
/-
Copyright (c) 2016 Microsoft Corporation. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Leonardo de Moura
-/
prelude
import init.meta.tactic
meta constant mk_nat_val_ne_proof : expr → expr → option expr
meta constant mk_nat_val_lt_proof : expr → expr → option expr
meta constant mk_nat_val_le_proof : expr → expr → option expr
namespace tactic
open expr
meta def comp_val : tactic unit :=
do t ← target,
guard (is_app t),
type ← infer_type t^.app_arg,
guard (type = const `nat []),
(do (a, b) ← returnopt (is_ne t),
pr ← returnopt (mk_nat_val_ne_proof a b),
exact pr)
<|>
(do (a, b) ← returnopt (is_lt t),
pr ← returnopt (mk_nat_val_lt_proof a b),
exact pr)
<|>
(do (a, b) ← returnopt (is_gt t),
pr ← returnopt (mk_nat_val_lt_proof b a),
exact pr)
<|>
(do (a, b) ← returnopt (is_le t),
pr ← returnopt (mk_nat_val_le_proof a b),
exact pr)
<|>
(do (a, b) ← returnopt (is_ge t),
pr ← returnopt (mk_nat_val_le_proof b a),
exact pr)
<|>
(do (a, b) ← returnopt (is_eq t),
unify a b, to_expr `(eq.refl %%a) >>= exact)
end tactic

View file

@ -13,3 +13,4 @@ import init.meta.backward init.meta.rewrite_tactic
import init.meta.mk_dec_eq_instance init.meta.mk_inhabited_instance
import init.meta.simp_tactic init.meta.set_get_option_tactics
import init.meta.interactive init.meta.converter init.meta.vm
import init.meta.comp_value_tactics

View file

@ -147,6 +147,9 @@ meta def is_constant_of : expr → name → bool
meta def is_app_of (e : expr) (n : name) : bool :=
is_app e && is_constant_of (get_app_fn e) n
meta def is_napp_of (e : expr) (c : name) (n : nat) : bool :=
to_bool (is_app_of e c ∧ get_app_num_args e = n)
meta def is_false (e : expr) : bool :=
is_constant_of e `false
@ -156,17 +159,34 @@ meta def is_not : expr → option expr
| e := none
meta def is_eq (e : expr) : option (expr × expr) :=
if is_app_of e `eq ∧ get_app_num_args e = 3
if is_napp_of e `eq 3
then some (app_arg (app_fn e), app_arg e)
else none
meta def is_ne (e : expr) : option (expr × expr) :=
if is_app_of e `ne ∧ get_app_num_args e = 3
if is_napp_of e `ne 3
then some (app_arg (app_fn e), app_arg e)
else none
meta def is_bin_arith_app (e : expr) (op : name) : option (expr × expr) :=
if is_napp_of e op 4
then some (app_arg (app_fn e), app_arg e)
else none
meta def is_lt (e : expr) : option (expr × expr) :=
is_bin_arith_app e `lt
meta def is_gt (e : expr) : option (expr × expr) :=
is_bin_arith_app e `gt
meta def is_le (e : expr) : option (expr × expr) :=
is_bin_arith_app e `le
meta def is_ge (e : expr) : option (expr × expr) :=
is_bin_arith_app e `ge
meta def is_heq (e : expr) : option (expr × expr × expr × expr) :=
if is_app_of e `heq ∧ get_app_num_args e = 4
if is_napp_of e `heq 4
then some (app_arg (app_fn (app_fn (app_fn e))),
app_arg (app_fn (app_fn e)),
app_arg (app_fn e),

View file

@ -14,6 +14,7 @@ Author: Leonardo de Moura
#include "kernel/replace_fn.h"
#include "library/expr_lt.h"
#include "library/deep_copy.h"
#include "library/comp_val.h"
#include "library/vm/vm.h"
#include "library/vm/vm_nat.h"
#include "library/vm/vm_string.h"
@ -322,6 +323,19 @@ vm_obj expr_copy_pos_info(vm_obj const & src, vm_obj const & tgt) {
return to_obj(copy_tag(to_expr(src), copy(to_expr(tgt))));
}
// TODO(Leo): move to a different file
vm_obj vm_mk_nat_val_ne_proof(vm_obj const & a, vm_obj const & b) {
return to_obj(mk_nat_val_ne_proof(to_expr(a), to_expr(b)));
}
vm_obj vm_mk_nat_val_lt_proof(vm_obj const & a, vm_obj const & b) {
return to_obj(mk_nat_val_lt_proof(to_expr(a), to_expr(b)));
}
vm_obj vm_mk_nat_val_le_proof(vm_obj const & a, vm_obj const & b) {
return to_obj(mk_nat_val_le_proof(to_expr(a), to_expr(b)));
}
void initialize_vm_expr() {
DECLARE_VM_BUILTIN(name({"expr", "var"}), expr_var);
DECLARE_VM_BUILTIN(name({"expr", "sort"}), expr_sort);
@ -355,6 +369,10 @@ void initialize_vm_expr() {
DECLARE_VM_BUILTIN(name({"expr", "hash"}), expr_hash);
DECLARE_VM_BUILTIN(name({"expr", "copy_pos_info"}), expr_copy_pos_info);
DECLARE_VM_CASES_BUILTIN(name({"expr", "cases_on"}), expr_cases_on);
DECLARE_VM_BUILTIN(name("mk_nat_val_ne_proof"), vm_mk_nat_val_ne_proof);
DECLARE_VM_BUILTIN(name("mk_nat_val_lt_proof"), vm_mk_nat_val_lt_proof);
DECLARE_VM_BUILTIN(name("mk_nat_val_le_proof"), vm_mk_nat_val_le_proof);
}
void finalize_vm_expr() {

View file

@ -0,0 +1,178 @@
open tactic
example : 0 < 1 := by comp_val
example : 0 < 2 := by comp_val
example : 0 < 3 := by comp_val
example : 0 < 4 := by comp_val
example : 0 < 5 := by comp_val
example : 0 < 6 := by comp_val
example : 0 < 1293821 := by comp_val
example : 0 < 1293822 := by comp_val
example : 1 < 2 := by comp_val
example : 1 < 3 := by comp_val
example : 1 < 4 := by comp_val
example : 1 < 5 := by comp_val
example : 1 < 6 := by comp_val
example : 1 < 1293821 := by comp_val
example : 1 < 1293822 := by comp_val
example : 2 < 3 := by comp_val
example : 2 < 4 := by comp_val
example : 2 < 5 := by comp_val
example : 2 < 6 := by comp_val
example : 2 < 1293821 := by comp_val
example : 2 < 1293822 := by comp_val
example : 3 < 4 := by comp_val
example : 3 < 5 := by comp_val
example : 3 < 6 := by comp_val
example : 3 < 1293821 := by comp_val
example : 3 < 1293822 := by comp_val
example : 4 < 5 := by comp_val
example : 4 < 6 := by comp_val
example : 4 < 1293821 := by comp_val
example : 4 < 1293822 := by comp_val
example : 103093 < 1293821 := by comp_val
example : 3121 < 1293822 := by comp_val
example : 312110028381818 < 1181171711293822 := by comp_val
example : 312110028381819 < 1181171711293822 := by comp_val
example : 312110028381819 < 1181171711293821 := by comp_val
example (h : false) : 0 < 0 := by (try comp_val >> contradiction)
example (h : false) : 1 < 1 := by (try comp_val >> contradiction)
example (h : false) : 120201 < 1 := by (try comp_val >> contradiction)
example (h : false) : 120201 < 32019 := by (try comp_val >> contradiction)
example (h : false) : 120202 < 1 := by (try comp_val >> contradiction)
example (h : false) : 120202 < 32019 := by (try comp_val >> contradiction)
example (h : false) : 120202 < 2 := by (try comp_val >> contradiction)
example (h : false) : 120202 < 3192 := by (try comp_val >> contradiction)
example : 0 ≤ 0 := by comp_val
example : 0 ≤ 1 := by comp_val
example : 0 ≤ 2 := by comp_val
example : 0 ≤ 3 := by comp_val
example : 0 ≤ 4 := by comp_val
example : 0 ≤ 5 := by comp_val
example : 0 ≤ 6 := by comp_val
example : 0 ≤ 1293821 := by comp_val
example : 0 ≤ 1293822 := by comp_val
example : 1 ≤ 1 := by comp_val
example : 1 ≤ 2 := by comp_val
example : 1 ≤ 3 := by comp_val
example : 1 ≤ 4 := by comp_val
example : 1 ≤ 5 := by comp_val
example : 1 ≤ 6 := by comp_val
example : 1 ≤ 1293821 := by comp_val
example : 1 ≤ 1293822 := by comp_val
example : 2 ≤ 2 := by comp_val
example : 2 ≤ 3 := by comp_val
example : 2 ≤ 4 := by comp_val
example : 2 ≤ 5 := by comp_val
example : 2 ≤ 6 := by comp_val
example : 2 ≤ 1293821 := by comp_val
example : 2 ≤ 1293822 := by comp_val
example : 3 ≤ 3 := by comp_val
example : 3 ≤ 4 := by comp_val
example : 3 ≤ 5 := by comp_val
example : 3 ≤ 6 := by comp_val
example : 3 ≤ 1293821 := by comp_val
example : 3 ≤ 1293822 := by comp_val
example : 4 ≤ 4 := by comp_val
example : 4 ≤ 5 := by comp_val
example : 4 ≤ 6 := by comp_val
example : 4 ≤ 1293821 := by comp_val
example : 4 ≤ 1293822 := by comp_val
example : 103093 ≤ 103093 := by comp_val
example : 103093 ≤ 1293821 := by comp_val
example : 3121 ≤ 1293822 := by comp_val
example : 312110028381818 ≤ 1181171711293822 := by comp_val
example : 312110028381819 ≤ 1181171711293822 := by comp_val
example : 312110028381819 ≤ 1181171711293821 := by comp_val
example : 1 ≤ 5 := by comp_val
example : 3 ≤ 5 := by comp_val
example (h : false) : 1 ≤ 0 := by (try comp_val >> contradiction)
example (h : false) : 2 ≤ 1 := by (try comp_val >> contradiction)
example (h : false) : 120201 ≤ 1 := by (try comp_val >> contradiction)
example (h : false) : 120201 ≤ 32019 := by (try comp_val >> contradiction)
example (h : false) : 120202 ≤ 1 := by (try comp_val >> contradiction)
example (h : false) : 120202 ≤ 32019 := by (try comp_val >> contradiction)
example (h : false) : 120202 ≤ 2 := by (try comp_val >> contradiction)
example (h : false) : 120202 ≤ 3192 := by (try comp_val >> contradiction)
example : 0 ≠ 1 := by comp_val
example : 0 ≠ 2 := by comp_val
example : 0 ≠ 3 := by comp_val
example : 0 ≠ 4 := by comp_val
example : 0 ≠ 5 := by comp_val
example : 0 ≠ 6 := by comp_val
example : 0 ≠ 1293821 := by comp_val
example : 0 ≠ 1293822 := by comp_val
example : 1 ≠ 0 := by comp_val
example : 1 ≠ 2 := by comp_val
example : 1 ≠ 3 := by comp_val
example : 1 ≠ 4 := by comp_val
example : 1 ≠ 5 := by comp_val
example : 1 ≠ 6 := by comp_val
example : 1 ≠ 1293821 := by comp_val
example : 1 ≠ 1293822 := by comp_val
example : 2 ≠ 0 := by comp_val
example : 2 ≠ 1 := by comp_val
example : 2 ≠ 3 := by comp_val
example : 2 ≠ 4 := by comp_val
example : 2 ≠ 5 := by comp_val
example : 2 ≠ 6 := by comp_val
example : 2 ≠ 1293821 := by comp_val
example : 2 ≠ 1293822 := by comp_val
example : 3 ≠ 0 := by comp_val
example : 3 ≠ 2 := by comp_val
example : 3 ≠ 1 := by comp_val
example : 3 ≠ 4 := by comp_val
example : 3 ≠ 5 := by comp_val
example : 3 ≠ 6 := by comp_val
example : 3 ≠ 1293821 := by comp_val
example : 3 ≠ 1293822 := by comp_val
example : 4 ≠ 0 := by comp_val
example : 4 ≠ 2 := by comp_val
example : 4 ≠ 3 := by comp_val
example : 4 ≠ 1 := by comp_val
example : 4 ≠ 5 := by comp_val
example : 4 ≠ 6 := by comp_val
example : 4 ≠ 1293821 := by comp_val
example : 4 ≠ 1293822 := by comp_val
example : 5 ≠ 0 := by comp_val
example : 5 ≠ 2 := by comp_val
example : 5 ≠ 3 := by comp_val
example : 5 ≠ 4 := by comp_val
example : 5 ≠ 1 := by comp_val
example : 5 ≠ 6 := by comp_val
example : 5 ≠ 1293821 := by comp_val
example : 5 ≠ 1293822 := by comp_val
example : 103093 ≠ 103095 := by comp_val
example : 103093 ≠ 1293821 := by comp_val
example : 3121 ≠ 1293822 := by comp_val
example : 312110028381818 ≠ 1181171711293822 := by comp_val
example : 312110028381819 ≠ 1181171711293822 := by comp_val
example : 312110028381819 ≠ 1181171711293821 := by comp_val
example (h : false) : 1 ≠ 1 := by (try comp_val >> contradiction)
example (h : false) : 2 ≠ 2 := by (try comp_val >> contradiction)
example (h : false) : 120201 ≠ 120201 := by (try comp_val >> contradiction)
example (h : false) : 32019 ≠ 32019 := by (try comp_val >> contradiction)
example (h : false) : 120202 ≠ 120202 := by (try comp_val >> contradiction)