저는 Microsoft의 SMT 솔버 인 Z3에서 귀납적 사실을 입증하려고합니다. Z3은 일반적으로 Z3 guide (8 단원 : 데이터 유형)에 설명 된대로이 기능을 제공하지 않지만 사실을 입증하려는 도메인을 제한 할 때 가능하다고 생각합니다. 다음의 예를 생각해Z3에서 귀납적 사실 증명
(declare-fun p (Int) Bool)
(assert (p 0))
(assert (forall ((x Int))
(=>
(and (> x 0) (<= x 20))
(= (p (- x 1)) (p x)))))
(assert (not (p 20)))
(check-sat)
솔버는 (p 20)
이 유효 함을 의미한다 unsat
제대로 응답합니다. 문제는 더 이상이 제약 조건을 완화하면 (앞의 예에서 20
을 20보다 큰 임의의 정수로 대체 함) 해결자가 unknown
으로 응답합니다.
원본 문제를 해결하기 위해 Z3을 길게 취하지 않기 때문에이 이상한 점을 발견하지만, 상한선을 하나 늘리면 갑자기 불가능 해집니다. 나는 다음과 같이 정량에 패턴을 추가하는 시도 : 잘 작동하는 것 같다,하지만 지금은 상한은 40입니다
(declare-fun p (Int) Bool)
(assert (p 0))
(assert (forall ((x Int))
(! (=>
(and (> x 0) (<= x 40))
(= (p (- x 1)) (p x))) :pattern ((<= x 40)))))
(assert (not (p 40)))
(check-sat)
이 내가 더 나은 같은 사실을 증명하기 위해 Z3를 사용할 수 없다는 뜻, 또는 내 문제를 잘못 공식화하고 있습니까?
감사합니다. 정말 도움이됩니다. 설정할 수있는 모든 옵션에 대한 자세한 정보를 제공하는 리소스가 있습니까? 나는 [이 목록] (http://research.microsoft.com/en-us/um/redmond/projects/z3/config.html)에 대해 알고 있지만 그것은 간결합니다. 어딘가에서 설명. – marczoid
아쉽게도 옵션에 대해 자세히 설명하는 문서/페이지가 없습니다. Z3을 새로운 매개 변수 설정 프레임 워크로 이동하려고합니다. 각 구성 요소에는 자체 매개 변수와 문서가 있습니다. 할 일 목록의 다른 항목은 주석에서 참조한 목록에서 쓸모없는 옵션을 제거하는 것입니다. –