In a bounded context (i.e. all basic sorts are bitvectors) we model (2-dim) sets as arrays. In some axioms we need to quantifier over this arrays.
Once we include such axioms, the solver returns unknown. From a syntactic view this kind of quantifiers goes beyond the scope of FOL
, but we have expected that the solver can recognize/use the bounded context information.
- Why the solver do not use the bounded context information?
- Is there any possibility, without hand quantifier blasting, to teach this to the solver?
Here is a minimal example:
(define-sort Any () (_ BitVec 6))
(define-sort Object () (_ BitVec 3))
(define-sort Field () (_ BitVec 2))
(define-sort Heap () (Array Object Field Any))
(define-sort LocSet () (Array Object Field Bool))
(declare-fun foo (Heap LocSet Heap) Heap)
(assert
(forall
((?h Heap) (?s LocSet) (?h2 Heap) (?o Object) (?f Field))
(= (select (foo ?h ?s ?h2) ?o ?f)
(select (ite (select ?s ?o ?f) ?h ?h2) ?o ?f))))
(check-sat)