프로그램 확인에 익숙하다면 배경 보다 먼저 질문을 읽는 것이 좋습니다. 프로그램 확인에 익숙하지 않은 경우에도 여전히이 질문에 대답 할 수 있지만 배경 지식을 먼저 읽는 것이 좋습니다.
배경
부분적 정확성을 확인할 수없는 경우가 종종 있습니다. 논의를 위해 Floyd-Hoare의 스타일 로이 진술을 정확하게하는 매우 특별한 방법을 선택합시다. 흐름 그래프는 고유와 소리를 나타내는 두 글자이다 초기 노드 모든 노드가 연결할 수있는. 프로그램은 그 노드 명령입니다 흐름 그래프이다. 세 가지 유형의 명령이 있습니다 (1) 가정 은 q , (2) 어설 션은 assert q 및 (3) 할당은 v : = e라고 가정합니다. 여기서 q 는 fol (1 차 논리) 공식이며 e 는 fol 항이며 v 는 변수입니다.
우리는 프로그램이라고 말할 부분적으로 올바른 각 노드에 주석을 할 수있는 방법이 존재하는 경우 , X 와 전제 A (X) 및 사후 조건 B (x)가 되도록 (1)를 초기 노드의 전제가 유효한지, (2) { A (X) } X는 { B (X)는 } 모든 명령에 대해 유지 (X) , (3) ( B (X)를 의미 A (Y)에 )의 모든 가장자리에 유효 X 로 Y . 여기서 Hoare 트리플은 다음과 같이 정의됩니다.
- { p } assert q { r }는 ( p는 ( q 및 r )이 유효 함을 의미 )
- { p } 는 q { r }이 (( p 및 q )가 r을 의미 함)을 의미 한다고 가정 합니다.
- { p } v : = e { r }는 (( p 가 e 를 v로 대체하면 p 는 r을 의미 )는 유효 함을 의미 합니다.
다음은 이 부분적 정확성을 검사 할 수없는 이유 에 대한 간단한 설명 입니다. 일부 a (x) 및 일부 b (x) 를 입력하면 일부 fol 수식이 유효한지 여부를 확인해야합니다.
부분적 정확성으로 종료를 인코딩하는 일반적인 방법은 본질적으로 "내가 마지막으로 실행 된 이후 종료 종료까지 진행되었다"고 말하는 특수한 주장을 추가하는 것입니다. 순서도의 모든 무한 보행 (초기 노드에서 시작)에 무한히 많은 진행 표시가 포함되도록 이러한 진행 표시 어설 션 을 배치해야합니다. 더 구체적으로 말하면, 진행 어설 션은 항상 assert u < v 형식을 가지며 , 여기서 u 와 v 는 양의 정수이며, 할당은 u : = f 앞에 오고 v : = u 가 뒤에옵니다 . 여기에 f 는변형 함수 , u 는 현재 값이고 v 는 이전 값입니다. 이제 우리는 "양의 정수"에 대해 이야기하고 그것들을 비교하기 때문에 fol보다 약간 더 많은 것을 사용할 수 있는지 확인해야 합니다. Peano 산술 이 가능 하다고 가정 해 봅시다 . (이 선택에 대해 강하게 느끼지 않습니다. 편리하다면 무시하십시오.) 물론 f 는 프로그램에서 언급 된 다른 함수와 상수를 사용할 수 있습니다. (프로그램 시작시 가정을 추가하는 것은 비논리적 공리를 도입하는 것과 같습니다.)
진행 어설 션이있는 프로그램이 여전히 부분적으로 올바른 경우 원래 프로그램이 종료 된 것입니다.
질문
종료 프로그램이 주어지면 진보 주장에 대한 변형 기능을 생각해내는 것이 어렵다고 생각합니다. 하지만 얼마나 힘들어요? (위의 거대한 배경에도 불구하고, 나는이 질문을 어떻게보고 싶은지에 따라 여전히 개방형 또는 잘못 정의 된 것으로 남았습니다.)
달리 말하면 : 종료를 부분 정확성으로 줄이는 문제를 공식화 한 다음 복잡성에 대해 이야기하는 참조를 찾고 있습니다. 물론이 모든 것을하는 대답은 환영받을 것입니다.