This PR adds str.len to symbols that are considered for instantiations.
It is motivated by a benchmark that originated from Boogie.
A minimized version of that benchmark is added as a regression.
|| k == APPLY_TESTER || k == UNION || k == INTERSECTION || k == SUBSET
|| k == SETMINUS || k == MEMBER || k == SINGLETON || k == SEP_PTO
|| k == BITVECTOR_TO_NAT || k == INT_TO_BITVECTOR || k == HO_APPLY
- || k == SEQ_NTH;
+ || k == STRING_LENGTH || k == SEQ_NTH;
}
bool Trigger::isRelationalTrigger( Node n ) {
regress0/seq/seq-nth.smt2
regress0/seq/seq-rewrites.smt2
regress0/seq/seq-types.smt2
+ regress0/seq/quant_len_trigger.smt2
regress0/sets/abt-min.smt2
regress0/sets/abt-te-exh.smt2
regress0/sets/abt-te-exh2.smt2
--- /dev/null
+; EXPECT: unsat
+
+(set-option :strings-exp true)
+(set-logic ALL)
+
+(assert (forall ((x (Seq Int)) (xx (Seq Int)) ) (=> (and (= (seq.len x) (seq.len xx)) (forall ((i Int) ) (=> (and (<= 0 i) (< i (seq.len x))) (= (seq.nth x i) (seq.nth xx i))))) (= x xx))))
+
+(declare-fun x () (Seq Int))
+(declare-fun y () (Seq Int))
+
+(assert (not (=> (= (seq.len x) (seq.len y)) (=> (forall ((i Int) ) (=> (and (<= 0 i) (< i (seq.len x))) (= (seq.nth x i) (seq.nth y i)))) (= x y)))))
+
+(check-sat)