fix: pattern matching on UInt

This commit is contained in:
Leonardo de Moura 2021-09-05 19:15:59 -07:00
parent 0d751f3bd3
commit fc334ffbee
3 changed files with 32 additions and 0 deletions

View file

@ -210,6 +210,16 @@ class erase_irrelevant_fn {
binding_body(minor));
}
expr elim_uint_cases(name const & uint_name, buffer<expr> & args) {
lean_assert(args.size() == 3);
expr major = visit(args[1]);
expr minor = visit_minor(args[2]);
lean_assert(is_lambda(minor));
return
::lean::mk_let(next_name(), mk_enf_object_type(), mk_app(mk_const(name(uint_name, "toNat")), major),
binding_body(minor));
}
expr decidable_to_bool_cases(buffer<expr> const & args) {
lean_assert(args.size() == 5);
expr const & major = args[2];
@ -235,6 +245,8 @@ class erase_irrelevant_fn {
return elim_int_cases(args);
} else if (I_name == get_array_name()) {
return elim_array_cases(args);
} else if (I_name == get_uint8_name() || I_name == get_uint16_name() || I_name == get_uint32_name() || I_name == get_uint64_name() || I_name == get_usize_name()) {
return elim_uint_cases(I_name, args);
} else if (I_name == get_decidable_name()) {
return decidable_to_bool_cases(args);
} else {

15
tests/lean/uintMatch.lean Normal file
View file

@ -0,0 +1,15 @@
def f : UInt8 → Bool
| 5 => true
| _ => false
#eval f 8
#eval f 5
def g : UInt32 → String
| 5 => "hello"
| 1555 => "world"
| _ => "bla"
#eval g 5
#eval g 1555
#eval g 555

View file

@ -0,0 +1,5 @@
false
true
"hello"
"world"
"bla"