@@ -576,13 +576,13 @@ impl<'a> Z3Manager {
576
576
if let Term :: Universe { index } = ty. as_ref ( ) {
577
577
if * index == 0 {
578
578
let key = app_ref ! ( to_universe( ) , TermRef :: new( t. clone( ) ) ) ;
579
- let sort_name = format ! ( "{:?}" , t) ;
580
- if check_exists ( & self . unknowns . 0 , key. clone ( ) ) {
581
- return Some ( sort_name) ;
579
+ let exist = check_exists ( & self . unknowns . 0 , key. clone ( ) ) ;
580
+ let id = lookup_in_cell_hashmap ( & self . unknowns . 0 , key) ;
581
+ let sort_name = format ! ( "$Type{id}" ) ;
582
+ if !exist {
583
+ let sort = smt2:: Sort :: Declare ( SortDecl :: new ( sort_name. clone ( ) , 0 ) ) ;
584
+ self . smt_ctx . sort ( sort) ;
582
585
}
583
- let sort = smt2:: Sort :: Declare ( SortDecl :: new ( sort_name. clone ( ) , 0 ) ) ;
584
- self . smt_ctx . sort ( sort) ;
585
- lookup_in_cell_hashmap ( & self . unknowns . 0 , key) ;
586
586
return Some ( sort_name) ;
587
587
}
588
588
}
@@ -719,7 +719,11 @@ mod tests {
719
719
) ;
720
720
convert_check ( r#""s" + "l" + " a" = "sl a""# , "(assert (not (= (str.++ (str.++ (seq.++ (seq.unit #x73) ) (seq.++ (seq.unit #x6C) )) (seq.++ (seq.unit #x20) (seq.++ (seq.unit #x61) ))) (seq.++ (seq.unit #x73) (seq.++ (seq.unit #x6C) (seq.++ (seq.unit #x20) (seq.++ (seq.unit #x61) )))))))\n (check-sat)\n " ) ;
721
721
convert_check ( r#"nth '*' "aa" 0 ∈ member_set "a""# , "(declare-const $x0 (Seq (_ BitVec 8)))\n (assert (not (select $x0 (seq.nth (seq.++ (seq.unit #x61) (seq.++ (seq.unit #x61) )) 0))))\n (check-sat)\n " ) ;
722
- // convert_check(r#"map (λ x, 2*x) [2] = [4]"#, "");
722
+ // convert_check(r#"map (λ x, 2*x) [2] = [4]"#, "");
723
+ convert_check (
724
+ r#"∀ A: DFA "()", Ldfa A = { s: list char | valid_paren s }"# ,
725
+ "(declare-const $x0 Bool)\n (assert $x0)\n (declare-sort $Type1 0)\n (declare-const A $Type1)\n (declare-const $x3 (Seq String))\n (declare-const $x4 (Seq String))\n (assert (not (= $x3 $x4)))\n (check-sat)\n " ,
726
+ ) ;
723
727
}
724
728
#[ test]
725
729
fn simple ( ) {
0 commit comments