2017-11-26 25 views

답변

2

나는 Prenex로 전환 할 전술이 있다고 생각하지 않지만, 수량 한정 제거 전술을 적용하고 공식을 더 처리 할 수는 있습니다. 변환 된 수식은 실제로 기계적으로 생성되므로 원본처럼 보이지 않습니다.

다음은 예입니다 :

여기 qe
from z3 import * 

f = Function('f', IntSort(), IntSort(), IntSort()) 
x, y = Ints('x y') 
p = ForAll(x, Or(x == 2, Exists(y, f (x, y) == 0))) 

print Tactic('qe')(p) 

은 정량 제거 전술이다. 이것은 생산 :

[[Not(Exists(x!0, 
      Not(Or(x!0 == 2, 
        Exists(x!1, 
          And(f(x!0, x!1) <= 0, 
           f(x!0, x!1) >= 0))))))]] 

를 전술에 좋은 자습서를 보려면 여기를 참조 : http://ericpony.github.io/z3py-tutorial/strategies-examples.htm

+0

감사합니다. 제 목표는 Z3에 의해 생성 된 수식을 qbf 해결사에 입력으로 변환하는 것입니다. 확실하지는 않지만 "qe"를 사용하면 일이 복잡해지고 표준 입력 형식으로 번역하기가 어려워집니다. – Pushpa

2

당신은 정의에 의해 prenex 형태가 될 skolemize 전술 (SNF)를 사용할 수 있습니다. 그러나 그것은 또한 당신이 원하는 것과는 다른 존재 한정어를 제거 할 것입니다. 여기에 예제가 있습니다. Z3는 bash 쉘에서

echo "(help-tactic)" | ./z3 -in | less 

를 실행하여 위의 당신이 사용할 수있는 전술을 볼 수 있습니다

(declare-fun c (Int) Bool) 
(declare-fun b (Int) Bool) 
(declare-fun a (Int) Bool) 
(assert (forall ((x Int)) 
      (or (exists ((y Int)) (a y)) (exists ((z Int)) (=> (b z) (c x)))))) 
(check-sat) 

같은 것을 응답한다 주어진다

(declare-fun a (Int) Bool) 
(declare-fun b (Int) Bool) 
(declare-fun c (Int) Bool) 
(assert 
    (forall ((x Int)) 
    (or 
     (exists ((y Int)) 
     (a y) 
    ) 
     (exists ((z Int)) 
     (=> 
      (b z) 
      (c x) 
     ) 
    ) 
    ) 
) 
) 
(apply 
    (and-then 
    ; mode (symbol) NNF translation mode: skolem (skolem normal form), quantifiers (skolem normal form + quantifiers in NNF), full (default: skolem) 
    (using-params snf :mode skolem) 
) 
    :print_benchmark true 
    :print false 
) 

.

불행히도 나는 그것이 prenex 로의 변환을 언급 한 것을 볼 수 없습니다.