String.Containts関数を実装しようとしています。いくつかの簡単なテストケースを作成しましたが、次のテストケース(UNSATを返す必要があります)はSATを返します。
テストでは、可能なすべてのサブ文字列を必要な文字列(Z3出力から取得したテキスト)と比較することにより、文字列'abcd'のサブ文字列'bd'を一致させようとします。
{(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)))))}
いろいろな実装を試みましたが、うまくいきませんでした。