@@ -409,6 +409,11 @@ namespace array {
409
409
def1 = a.mk_default (store);
410
410
def2 = a.mk_default (store->get_arg (0 ));
411
411
412
+ prop |= !ctx.get_enode (def1) || !ctx.get_enode (def2);
413
+
414
+ euf::enode* ndef1 = e_internalize (def1);
415
+ euf::enode* ndef2 = e_internalize (def2);
416
+
412
417
if (has_unitary_domain (store)) {
413
418
def2 = store->get_arg (num_args - 1 );
414
419
}
@@ -417,8 +422,8 @@ namespace array {
417
422
// let A = store(B, i, v)
418
423
//
419
424
// Add:
420
- // default(A) = ite(epsilon1 = i, v, default(B))
421
- // A[diag(i)] = B[diag(i) ]
425
+ // default(A) = A[epsilon]
426
+ // default(B) = B[epsilon ]
422
427
//
423
428
expr_ref_vector eqs (m);
424
429
expr_ref_vector args1 (m), args2 (m);
@@ -428,22 +433,20 @@ namespace array {
428
433
for (unsigned i = 1 ; i + 1 < num_args; ++i) {
429
434
expr* arg = store->get_arg (i);
430
435
sort* srt = arg->get_sort ();
431
- auto ep = mk_epsilon (srt);
432
- eqs.push_back (m.mk_eq (ep. first , arg));
433
- args1.push_back (m. mk_app (ep. second , arg) );
434
- args2.push_back (m. mk_app (ep. second , arg) );
436
+ auto [ep, d] = mk_epsilon (srt);
437
+ eqs.push_back (m.mk_eq (ep, arg));
438
+ args1.push_back (ep );
439
+ args2.push_back (ep );
435
440
}
436
- expr_ref eq (m.mk_and (eqs), m);
437
- def2 = m.mk_ite (eq, store->get_arg (num_args - 1 ), def2);
438
441
app_ref sel1 (m), sel2 (m);
439
442
sel1 = a.mk_select (args1);
440
443
sel2 = a.mk_select (args2);
441
- prop |= !ctx. get_enode (sel1) || !ctx. get_enode (sel2);
442
- if ( ctx.propagate (e_internalize (sel1), e_internalize (sel2) , array_axiom ()))
443
- prop = true ;
444
+ return
445
+ ctx.propagate (e_internalize (sel1), ndef1 , array_axiom ()) ||
446
+ ctx. propagate ( e_internalize (sel2), ndef2, array_axiom ()) ;
444
447
}
445
- prop |= !ctx. get_enode (def1) || !ctx. get_enode (def2);
446
- if (ctx.propagate (e_internalize (def1), e_internalize (def2) , array_axiom ()))
448
+ // default(A) == default(B)
449
+ if (ctx.propagate (ndef1, ndef2 , array_axiom ()))
447
450
prop = true ;
448
451
return prop;
449
452
}
0 commit comments