mirror of
https://github.com/Z3Prover/z3
synced 2025-04-15 13:28:47 +00:00
add consequences forcing character values to be digits
This commit is contained in:
parent
36d265a32c
commit
f239aeb4d4
|
@ -820,16 +820,20 @@ namespace seq {
|
||||||
/*
|
/*
|
||||||
* len(ubv2s(b)) = k => 10^k-1 <= b < 10^{k} k > 1
|
* len(ubv2s(b)) = k => 10^k-1 <= b < 10^{k} k > 1
|
||||||
* len(ubv2s(b)) = 1 => b < 10^{1} k = 1
|
* len(ubv2s(b)) = 1 => b < 10^{1} k = 1
|
||||||
|
* len(ubv2s(b)) >= k => is_digit(nth(ubv2s(b),0) & ... & is_digit(nth(ubv2s(b),k-1)
|
||||||
*/
|
*/
|
||||||
void axioms::ubv2s_len_axiom(expr* b, unsigned k) {
|
void axioms::ubv2s_len_axiom(expr* b, unsigned k) {
|
||||||
expr_ref ge10k(m), ge10k1(m), eq(m);
|
expr_ref ge10k(m), ge10k1(m), eq(m), is_digit(m);
|
||||||
|
expr_ref ubvs(seq.str.mk_ubv2s(b), m);
|
||||||
|
expr_ref len(seq.str.mk_length(ubvs), m);
|
||||||
|
expr_ref ge_len(a.mk_ge(len, a.mk_int(k)), m);
|
||||||
bv_util bv(m);
|
bv_util bv(m);
|
||||||
sort* bv_sort = b->get_sort();
|
sort* bv_sort = b->get_sort();
|
||||||
unsigned sz = bv.get_bv_size(bv_sort);
|
unsigned sz = bv.get_bv_size(bv_sort);
|
||||||
rational pow(1);
|
rational pow(1);
|
||||||
for (unsigned i = 1; i < k; ++i)
|
for (unsigned i = 1; i < k; ++i)
|
||||||
pow *= 10;
|
pow *= 10;
|
||||||
expr_ref len(seq.str.mk_length(seq.str.mk_ubv2s(b)), m);
|
|
||||||
if (pow >= rational::power_of_two(sz)) {
|
if (pow >= rational::power_of_two(sz)) {
|
||||||
expr_ref ge(a.mk_ge(len, a.mk_int(k)), m);
|
expr_ref ge(a.mk_ge(len, a.mk_int(k)), m);
|
||||||
add_clause(~ge);
|
add_clause(~ge);
|
||||||
|
@ -844,6 +848,12 @@ namespace seq {
|
||||||
add_clause(~eq, ~ge10k1);
|
add_clause(~eq, ~ge10k1);
|
||||||
if (k > 1)
|
if (k > 1)
|
||||||
add_clause(~eq, ge10k);
|
add_clause(~eq, ge10k);
|
||||||
|
|
||||||
|
for (unsigned i = 0; i < k; ++i) {
|
||||||
|
expr* ch = seq.str.mk_nth_i(ubvs, i);
|
||||||
|
is_digit = seq.mk_char_is_digit(ch);
|
||||||
|
add_clause(~ge_len, is_digit);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void axioms::ubv2ch_axiom(sort* bv_sort) {
|
void axioms::ubv2ch_axiom(sort* bv_sort) {
|
||||||
|
|
Loading…
Reference in a new issue