당신의 공리는 실제로 공리가 아니며, 가설이 빠져 있습니다. Hoare 논리의 간단한 표현은 형식의 공식을 조작합니다. 여기서 P 및 P ' 는 논리적 인 공식이고 C 는 명령입니다. C 가 올바른지 확인 해야합니다 . Hoare 논리에 대한 첫 번째 소개에 자주 사용되는 언어와 같은 간단한 언어에서 올바른 형식은 구문 적입니다. 일반적으로 C 를 확인하는 문제입니다.{P}C{P′}PP′CCC문맥이없는 문법을 준수하며 자유 변수가 허용 된 세트 내에있을 수 있습니다. 언어에 배열 요소에 대한 액세스와 같이 시맨틱 정확성이있는 구문이 포함 된 경우이 시맨틱 정확성을 표현하기 위해 가설을 추가해야합니다.
공식적으로 표현과 명령의 수정을 표현하기 위해 판단을 추가 할 수 있습니다. 표현식에 부작용이 없으면 사후 조건이 필요하지 않으며 전제 조건 만 필요합니다. 예를 들어 { P } 와 같은 올바른 규칙을 작성할 수 있습니다.
이며 명령에서 올바른 형식의 표현식 만 허용합니다.
{P[x←E]}
{P}E wf{P∧0≤E<length(A)}A[E] wf{P}E1 wf{P}E2 wf{P}E1+E2 wf
{P[x←E]}E wf{P[x←E]}x:=E{P}
errorerrorError¬Error
{P[x←E]}x:=E{P∨Error}P[x←E]⟹E↛error{P[x←E]}x:=E{P}
또 다른 접근법은 프로그램이 올바르게 종료 된 경우에만 Hoare triple을 유지하는 것입니다. 이것은 종료되지 않는 프로그램에 대한 일반적인 접근 방식입니다. 명령이 종료 될 때 사후 조건이 유지되므로 항상 발생하지는 않습니다. 런타임 오류를 종료가 아닌 것으로 취급하면 모든 정확성 문제를 해결해야합니다. 여전히 프로그램의 정확성을 증명해야하지만, 해당 작업에 다른 형식을 선호하는 경우 Hoare 논리에있을 필요는 없습니다.
PIsSorted(A)A[i]←EPA[i]←PPA[A[0]−1]:=A[0]A[0]=2∧A[1]=3A[0]=1∧A[1]=1A[0]A[0]A←A[i←E]
length
되어A
있습니까?