SHA (x)와 같은 z3에서 해시 함수를 나타내고 싶습니다. 몇 가지 조사를 한 후에 z3이 분사 성을 잘 지원하지 않기 때문에 제약 조건을 가질 수 없다는 것을 깨달았습니다. (그리고 이것은 충돌로 인해 엄격히 말해서 진실이 아니라는 것을 깨닫는 동안, 휴리스틱으로 유용합니다. 프로젝트)주입 기능을 지원하지 않는 z3에 대한 해결 방법
forall([x, y],Implies(SHA(x)==SHA(y), x==y))
솔버가 종료 될 것으로 예상하십시오.
내 질문에이 문제에 대한 알려진 최적의 해결 방법이 있습니까? 예를 들어 한정 기호를 사용하지 않고 x와 y의 모든 쌍에 Implies (SHA (x) == SHA (y), x == y) 제약 조건을 추가하면 문제가 해결됩니까? 우리는 폼의 인코딩을 사용하여 해석의 기능 용
부분 역변환을 사용하면 여전히 Implies (f (x) == f (y), x == y)의 순진한 접근법을 사용하는 것과 똑같은 문제가 있습니다. 즉 해결자가 솔루션을 찾을 수 없습니다. 간단한 문제. 예 : '수입 Z3 z3.BitVec A = ('A ', 32) z3.BitVec B = ('B ', 32) z3.BitVec X = ('X ', 32)의 해시 (32), z3.BitVecSort (32)) hash_inv = z3.Function ('hash', z3.BitVecSort (32), z3.BitVecSort (32)) hash_preds = z3.Solver() z3.set_param (자세한 정보 = 10) s.add (hash_pred) s.add (해쉬 (x)) == x) a)! = hash (b)) s.add (a! = b) s.check()' – dirtyfilthy