필자가 연구 도구의 일부로 Z3 Python 인터페이스를 사용하고 있으며 동일한 쿼리에서 Z3 해석기를 반복적으로 실행할 때 매우 이상한 동작을 발견했습니다. 특히 달리기 전에 명시 적으로 솔버를 재설정하더라도 매번 같은 결과를 얻지는 않습니다.Z3 결과의 임의성
import z3
with open("query.smt", "r") as smt_reader:
query_lines = "".join(smt_reader.readlines())
for i in xrange(3):
solver = z3.Solver()
solver.reset()
queryExpr = z3.parse_smt2_string(query_lines)
equivalences = queryExpr.children()[:-1]
for equivalence in equivalences:
solver.add(equivalence)
# Obtain the Boolean variables associated with the constraints.
constraintVars = [equivalence.children()[0] for equivalence
in equivalences]
# Check the satisfiability of the query.
querySatResult = solver.check(*constraintVars)
print solver.model().sexpr()
print solver.statistics()
print ""
위의 코드 Z3 해결사 세 번 다시는-만들고 동일한 쿼리의 satisfiability을 확인 : 참고로, 여기 내 코드입니다. 쿼리는 located here입니다.
위의 코드 섹션은 Z3 Python 인터페이스를 사용하는 방법과 정확히 일치하지 않지만 Z3 솔버는 동일한 쿼리의 코드 지점에서 두 번 호출 될 때 서로 다른 결과를 나타냅니다 결과. 이것이 의도적인지 궁금해하고 있었고, 이것을 불가능하게 만들거나 결정론을 보장 할 방법이 있는지 궁금해하고있었습니다.
좋아, 흠 오, 의미가 있습니다 :
는 다음과 같은 관련 질문을 참조하십시오. 이 주위에 어떤 방법이 있습니까? Z3 Python 인터페이스를 다른 방식으로 사용해야합니까? –
그리고 예, 저는 실제로 "다른"다른 모델을 의미했습니다. 애매한 점 죄송합니다. –
Jon, 해결 방법이 없습니다. 나는 이것이 문제라는 것을 깨닫는다. 나는'src/ast/ast_lt.cpp' 파일에 정의 된 표현식에 대한 총 순서를 사용하여 관계를 깨뜨리기 위해 코드를 수정하려고 시도해 왔습니다. 그러나 변수의 이름을 바꾸면 다른 솔루션이 시작되기 때문에 완벽한 솔루션이 아닙니다. 아이디어/제안이 있으시면 언제든지 http://z3.codeplex.com/discussions –