2016-09-09 3 views
0

Z3 고정 소수점 엔진의 두 가지 입력 형식이 서로 어떻게 관련되어 있는지 혼란스럽고 분투하고 있습니다. 간단한 예 : 음수의 존재를 증명하고 싶다고 가정 해 봅시다. 음수가 아닌 경우 1을 반환하고 음수 인 경우 0을 반환하는 함수를 선언하고 함수가 0을 반환하는 인수가 있으면 해결자가 실패하도록 요청하는 함수를 선언합니다. 그러나 하나의 제한이 있습니다. 적어도 하나가 존재하면 해결자를 sat 음수가 아닌 경우 모두 unsat입니다.Z3 고정 소수점 엔진을 사용하는 ∃-queries 및 ∀-queries

그것은 declare-relquery 형식을 사용하여 하찮게입니다 :

(declare-rel f (Int Int)) 
(declare-rel fail()) 
(declare-var n Int) 
(declare-var m Int) 

(rule (=> (< n 0) (f n 0))) 
(rule (=> (>= n 0) (f n 1))) 

(rule (=> (and (f n m) (= m 0)) fail)) 
(query fail) 

을하지만 (forall에) 순수 SMT-LIB2 형식을 사용하면서 까다로운된다. 예를 들어, 직선

(set-logic HORN) 
(declare-fun f (Int Int) Bool) 
(declare-fun fail() Bool) 

(assert (forall ((n Int)) 
    (=> (< n 0) (f n 0)))) 
(assert (forall ((n Int)) 
    (=> (>= n 0) (f n 1)))) 

(assert (forall ((n Int) (m Int)) 
    (=> (and (f n m) (= m 0)) fail))) 
(assert (not fail)) 

(check-sat) 

unsat을 반환합니다. 당연히 (= m 0)(= m 1)으로 변경하면 결과가 동일합니다. satfail을 의미하고 (= m 2)에서 얻을 수 있습니다. 문제는 내가 이해할 수 없다는 것인데, 해답을 구하는 방법이 형식을 사용하는 것입니다. 대답 sat 즉, 우리는 ∀-해결책을 찾기 위해 요청할 수 있습니다 forall 형을 사용하는 동안 나는 순간에 그것을 이해하고있어 어떻게

는 해석이 해석 (또는 불변) 모든 에 대한 모든 주장을 satisfiying을 발견 할 수 있음을 의미 값이고 unsat은 그러한 기능이 없음을 의미합니다. 즉 을 증명하려고 시도합니다. 즉, 'proof'(불변 식)를 모델에 넣습니다 (분명히, sat 일 때). declare-rel 형식 해결사에서 솔루션을 보내고 반대로

, query는 제약이 ∃ - 정량에 따라 일부 변수처럼 에 대한 솔루션을 검색합니다. 즉, 의 카운터 예제을 제공합니다. unsat의 경우에만 불변량을 인쇄 할 수 있습니다.

  1. 내가 올바른 그것을 이해하고 있습니까 :

    나는 몇 가지 질문이 있습니까? 몇 가지 핵심 아이디어를 놓친 것처럼 느껴집니다. 예를 들어, 을 (assert (forall ...))으로 표현하는 방법에 대한 일반적인 아이디어는 정말 도움이 될 것입니다 (질문 2를 자동으로 답합니다).
  2. 순수 SMT-LIB2 형식으로 이러한 ∃-constraints (반올림 할 때 sat 출력)를 풀 수있는 방법이 있습니까? 그렇다면 어떻게?

답변

2

우선 "declare-rel", "declare-var", "rule"및 "query"를 사용하는 형식은 SMT-LIB2에 대한 사용자 지정 확장입니다. "declare-var"기능은 여러 규칙에서 바운드 변수를 생략 할 때 편리합니다. 또한 계층화 된 부정으로 Datalog 규칙을 공식화 할 수 있으며 이의 의미는 계층화 부정 (stratified negation)에서 기대해야하는 것입니다. 규칙에 따라 쿼리에는 파생이 있음을 나타내는 "sat"와 쿼리에 파생물이 없다는 "unsat"가 사용됩니다.

표준 SMT-LIB2가 원하는 것을 거의 표현할 수 있다는 사실이 밝혀졌습니다. 부정을 제외한 절절.규칙은 의미가되며 검색어는 양식의 의미 (=> 검색어 거짓) 또는 작성한대로 (검색어가 아닌 경우) 의미합니다. 사용자 정의 형식의 파생어는 빈 절의 증명에 해당합니다 (예 : "쿼리"의 증명, "거짓"을 증명). 따라서 파생어가 존재한다는 것은 SMT-LIB2 어설 션이 "unsat"임을 의미합니다. 반대로 Horn 절에 대한 해석 (모델)이있는 경우 그러한 모델은 유도가 없음을 확립합니다. 이 절은 "앉아"있습니다. 즉

:

"sat" for datalog extension <=> "unsat" for SMT-LIB2 formulation 
"unsat" for datalog extension <=> "sat" for SMT-LIB2 formulation 

이 적용되면, 는 특별한 구문 확장이없는 즉, 순수 SMT-LIB2 형식을 사용의 장점. 이것들은 일반 SMT 수식이며 수식의이 클래스를 해결하고자하는 사람들은 확장자를 쓸 필요가 없으므로 호른 절이 적절한 수식 클래스를 인식하도록 조정해야합니다. (Z3의 구현 인 의 HORN 프래그먼트는 호른 절을 쓰는 데 약간의 유연성을 허용합니다.) 본문에 불일치가있을 수 있으므로 카 드리 딩을 할 수 있습니다.

규칙 기반 형식이 도움이되는 SMT-LIB2 형식을 사용할 때 한 가지 단점이 있습니다. 쿼리 파생이있는 경우 규칙 기반 형식에 튜플 요소 인쇄를위한 pragma가 있습니다. 일반적으로 쿼리 관계에는 인수가 사용될 수 있습니다. 이 기능은 유한 도메인 관계에 유용합니다. 위 예제는 정수를 사용하므로 관계는 유한 도메인이 아니지만 온라인 자습서의 예는 유한 도메인 인스턴스를 포함합니다. 이제 쿼리의 파생어도 확인 증명에 해당합니다. SMT-LIB2 케이스에서 해답 증명을 추출 할 수는 있지만, 그것이 이라고 생각해야합니다. 효과적으로 사용하는 방법을 찾지 못했습니다. Horn 절의 "이중성"엔진은 보다 기본 형식 증명 형식 인 Z3보다 쉽게 ​​액세스 할 수있는 형식으로 파생어를 생성합니다. 어느 쪽이든, 거의 사용되지 않기 때문에 사용자가 증명 인증서로 작업하려고하면 장애가 발생할 수 있습니다. 규칙 기반 형식에는 파생 경로에 해당하는 인스턴스가있는 조건부 집합을 어셈블하는 또 다른 기능이 있습니다. 이 출력에 눈을 맞추는 것이 더 쉽습니다.

+0

Nikolaj, 명확하고 완전한 답변을 주셔서 대단히 감사합니다. – dvvrd