实现一个模拟字符串Contains方法的公式

时间:2012-09-06 16:05:58

标签: z3 smt

我正在尝试实现String.Containts函数。 我写了一些简单的测试用例,但下面的一个(应该返回UNSAT)返回SAT。

测试尝试匹配字符串'abcd'中的子字符串'bd',将所有可能的子字符串与所需的字符串进行比较(从Z3输出中获取文本):

{(exists ((i Int))
  (let ((a!1 (forall ((k Int))
               (and (>= k i)
                    (<= k (+ i 1))
                    (= (select stringToScan k) (select substring (- k i)))
                    (= (select stringToScan 0) #x0061)
                    (= (select stringToScan 1) #x0062)
                    (= (select stringToScan 2) #x0063)
                    (= (select stringToScan 3) #x0064)
                    (= (select stringToSearch 0) #x0062)
                    (= (select stringToSearch 1) #x0064)))))
    (and (>= i 0)
         (< i 2)
         a!1
         (= (select substring 0) (select stringToSearch 0))
         (= (select substring 1) (select stringToSearch 1)))))}

我尝试了各种实现,但没有任何成功。

1 个答案:

答案 0 :(得分:1)

如果断言公式,则返回UNSAT。

http://rise4fun.com/Z3/szN

部分:

(forall ((k Int))
           (and (>= k i)
                (<= k (+ i 1)) ...)))

是假的,因为你可以将k设置为i + 2或i - 1。 你可能意味着写一个暗示而不是一个连词。 有时使用数组作为字符串不是执行编码的最佳方法。 自动机工具包(参见:http://rise4fun.com/Rex)使用序列。