저는 ZA와 JAVA 바인딩을 2 년 동안 사용해 왔습니다. 어떤 이유로 든 SMTLib2 코드를 직접 String으로 생성 한 다음 parseSMTLib2String
을 사용하여 해당 Z3 Expr을 작성했습니다. 내가 기억할 수있는 한,이 메소드로 정확히 동일한 입력을 두 번 입력 할 때마다 항상 동일한 모델을 갖게됩니다.여러 번 실행하면 Z3이 다른 모델을 생성합니다.
하지만 최근에 Java API를 직접 변경하고 ctx.mk...()
으로 표현식을 작성하기로 결정했습니다. 기본적으로 String을 생성하고 파싱하지는 않지만 Z3이 Z3 Expr을 빌드하는 작업을 수행하게합니다.
이제 솔버가 실제로 똑같은 코드를 저장하는지 확인하는 동안 다른 모델을 얻게됩니다. 내 자바 코드는 다음과 같이 보입니다 :
static final Context context = new Context();
static final Solver solver = context.mkSolver();
public static void someFunction(){
solver.add(context.mk...()); // Add some bool expr to the solver
Status status = solver.check();
if(status == SATISFIABLE){
System.out.println(solver.getModel()); // Prints different model with same expr
}
}
내가 만들고있어 1 개 이상의 런타임시 호출 '된 SomeFuncion() "및 점검 표현 context.mk...()
변경. 그러나 프로그램을 두 번 실행하면 동일한 표현 순서가 확인되고 실행마다 다른 모델이 표시되는 경우가 있습니다.
auto-config 매개 변수를 비활성화하고 임의의 시드를 설정하려고 시도했지만 Z3은 여전히 다른 모델을 생성합니다. 나는 바운드 된 정수 변수와 해석되지 않은 함수만을 사용하고 있습니다. 잘못된 방식으로 API를 사용하고 있습니까?
필요한 경우이 질문에 전체 SMTLib2 코드를 추가 할 수 있지만 실제로는 짧지 않고 여러 해석 호출이 포함되어 있습니다 (어느 모델이 한 실행에서 다른 실행으로 다른 모델을 생성하는지조차 알지 못합니다. 그냥 일부는 알고).
정확하게 다음 문장을 읽어야하지만 "Z3은 결정적이며 동일한 입력에 대해 동일한 모델을 만들어야합니다."라는 대답이 구식이거나 (정확하게 이해할 경우) 답변을 찾지 못했습니다. :
different run time for the same code in Z3
편집 : 놀랍게도 다음 코드를 사용하면 항상 동일한 모델을 얻는 것처럼 보이고 Z3은 이제 결정적으로 보입니다. 그러나 잠시 동안 컨텍스트를 메모리에 유지해야하기 때문에 메모리 사용량이 이전 코드와 비교할 때 커집니다. 적은 메모리 사용량으로 동일한 동작을 달성하기 위해 내가 할 수있는 아이디어는 무엇입니까? 여기
public static void someFunction(){
Context context = new Context();
Solver solver = context.mkSolver();
solver.add(context.mk...()); // Add some bool expr to the solver
Status status = solver.check();
if(status == SATISFIABLE){
System.out.println(solver.getModel()); // Seem to always print the same model :-)
}
}
내가 메소드를 호출에서 얻을 "SomeFunction을"여러 번 메모리 소비입니다 :만큼이 같은 문제에 SAT 및 UNSAT 사이를 전환하지 않는 한
고맙습니다. 이 솔버는 SAT에서 UNSAT으로 토글하지 않으므로 항상 올바른 대답을 제공하므로 문제가 없습니다. 이미 API로 인코딩을 시도하고 구문 분석했지만 모델이 여전히 변경된 것 같습니다. 즉, 여기에서 나온 것처럼 보이지 않습니다. 편집 한 질문을 확인해 주시겠습니까? 나는 해결 방법을 찾았지만 여전히 만족스럽지는 않다. –
사실, API가 아닌 파서를 사용하여 이전 버전을 시험해 보았습니다. 프로그램을 한 번 실행하는 동안 동일한 수식을 두 번 솔버에 제공하면 모델이 항상 같지는 않은 것으로 나타났습니다. 그러나 프로그램을 두 번 실행하고 동일한 수식을 제공하면 해결사는 항상 동일한 모델을 제공합니다 ... 내 프로그램을 수 백 번 실행하고 항상 동일한 모델을 사용했습니다. 그러나 파서가 아닌 API를 사용해 보았을 때, 모델은 매우 매우 다르다. 나는 행동이 왜 그렇게 다른지에 대한 설명을 찾기 위해 고심하고있다. –