배열과 배열 목록을 매개 변수로 사용하고 목록의 배열 색인을 반환하는 함수를 형식화하려고합니다. 나는 매우 다른 접근법을 시도하고 Z3에서 "알려지지 않은"것을 얻는다.Z3 - 배열 패턴 일치하기
이(declare-fun SameArray ((Array Int Real) (Array Int Real)) Bool)
(declare-fun Match ((Array Int Real) (Array Int (Array Int Real))) Int)
(assert (forall ((array1 (Array Int Real)) (array2 (Array Int Real)))
(=
(SameArray array1 array2)
(ite (forall ((i Int)) (= (select array1 i) (select array2 i))) true false)
)
)
)
;(assert (forall ((pattern (Array Int Real)) (list (Array Int (Array Int Real))))
; (or
; (exists ((index Int))
; (and
; (= (SameArray pattern (select list index)) true)
; (forall ((j Int)) (or (= (SameArray pattern (select list j)) false) (>= j index)))
; (= (Match pattern list) index)
; )
; )
; (= (Match pattern list) (- 1))
; )
;))
(assert (forall ((pattern (Array Int Real)) (list (Array Int (Array Int Real))))
(exists ((index Int))
(and
(= (Match pattern list) index)
(or
(and
(= (SameArray pattern (select list index)) true)
(forall ((j Int)) (or (= (SameArray pattern (select list j)) false) (>= j index)))
)
(= index (- 1))
)
)
)
))
; Testing - SameArray
(declare-const a1 (Array Int Real))
(declare-const a2 (Array Int Real))
(assert (= (store a1 1 1.1) a1))
(assert (= (store a1 2 1.2) a1))
(assert (= (store a1 3 1.3) a1))
(assert (= (store a2 1 2.1) a2))
(assert (= (store a2 2 2.2) a2))
(assert (= (store a2 3 2.3) a2))
(assert (= (SameArray a1 a1) true))
(assert (= (SameArray a1 a2) false))
(check-sat)
; Testing - Match
(declare-const aAll (Array Int (Array Int Real)))
(assert (= (store aAll 1 a2) aAll))
(assert (= (store aAll 2 a1) aAll))
(assert (= (Match a1 aAll) 2))
(check-sat)
편집 : 에도 매우 간단 더미 버전은 작동하지 않습니다 여기에
내가 첫 번째 나 두 번째 공리 작업 (여러 다른 여기에 포함되지 않았다)도 이에 시도하는 코드이다. 나는 패턴 (P => Q)과 (P => Q '가 아님)을가집니다. 왜 Z3이 나에게 unknwon을 주는지 나는 모른다.(assert (forall ((pattern (Array Int Real)) (list (Array Int (Array Int Real))))
(=>
(forall ((j Int)) (= (SameArray pattern (select list j)) false))
(= (Match pattern list) (- 1))
)
))
(assert (forall ((pattern (Array Int Real)) (list (Array Int (Array Int Real))))
(=>
(not (forall ((j Int)) (= (SameArray pattern (select list j)) false)))
(= (Match pattern list) 1)
)
))
의견을 보내 주셔서 감사합니다. 하지만 MBQI와 AUTO_CONFIG를 비활성화하지 않았기 때문에 둘 다 활성화되었습니다. 나는 첫 번째 체크 - 자리가 (sat)라고 가정 할 것이다. 왜냐하면 그것들은 상충되는 공리가 아니기 때문이다. 배열 a1이 aAll의 두 번째 위치에 있기 때문에 두 번째도 함께 있어야합니다. 그러나 둘 모두에 대해 "알 수 없음"이 있습니다. 얻을 수있는 Z3 버전은 무엇입니까? My는 4.1이고 나는 알 수 없다. –
@ChristianLiguda rise4fun은 Z3 버전으로 4.3을보고합니다. MBQI 및 AUTO_CONFIG를 비활성화하려고 했습니까? 결과가 바뀌 었습니까? –
이제 Z3 4.3을 사용해 보았습니다. MBQI 및 AUTO_CONFIG를 활성화 및 비활성화하고 두 항목 모두에 대해 "알 수 없음"을 표시합니다 (check-sat). 따라서 옵션은 위 예제의 결과에 영향을주지 않습니다. –