두 함수가 같은 확장인지 계산할 수 있습니까?


9

다른 정렬 알고리즘을 구현하는 두 개의 함수가있는 경우 소스 코드를 통해 둘 다 동일한 외부 특성을 갖는 것으로 추론 할 수 있습니까? 둘 다 가능한 정렬되지 않은 시퀀스를 입력으로하고 정렬 된 시퀀스를 출력으로한다는 것을 의미합니까? 이러한 외부 속성은 소스 코드에 의해 어떤 방식으로 결정될 수 있습니까? 이러한 외부 속성을 어떻게 설명 하시겠습니까? 어떤 표기법이 사용됩니까?

외부 속성은 예를 들어 유형 시스템 내에서 명시 적으로 정의하여 알 수 있지만 암시 적으로 수행 할 수 있는지 궁금합니다. 아니면 이런 종류의 의미론을 추론하는 것이 이론적으로 불가능합니까? 함수와 같은 것이 항상 중단되고 부작용이 없다고 가정하고 알고리즘 정렬뿐만 아니라 임의의 함수에 이것이 가능한지에 관심이 있습니다.

denatotional 의미를보아야합니까, 아니면 관련이 없습니까?

이 분야에 대한 연구와 내 논문 검색에 도움이 될 수있는 주제를 설명하는 데 사용되는 다른 용어에 대한 포인터에 관심이 있습니다.

답변:


8

예. 동일한 지 확인할 수 있으면 컴퓨터도 마찬가지입니다.

Coq의 정수 정렬에 대한 빠른 사양은 다음과 같습니다.

Inductive natlist : Type :=
| nil : natlist
| cons : nat → natlist → natlist.

Fixpoint is_sorted (l : natlist ) : bool :=
    match l with
    |  nil => true
    |  (cons x nil) => true
    |  (cons x (cons y r)) => if x <= y then is_sorted (cons y r) else false
    end.

...

Theorem sort_spec : forall l, is_sorted (sort_list l).

스펙은 종속 유형을 사용하여 정렬 선언으로 직접 인코딩 될 수 있습니다.

이 특별한 문제에 대해, John Darlington은 70 년대에 정렬의 스펙을 구현으로 기계적으로 변환함으로써 6 개의 정렬 알고리즘 패밀리가 도출 될 수 있음을 보여주었습니다. 나는 이것이 "의미론 기반 프로그램 도출"이라는 이름으로 믿어진다.

소프트웨어 엔지니어링 세계에서 확장 적으로 동등한 기능을 찾는 것을 "의미 론적 복제 탐지"라고합니다.

데이브 클라크는 또한 CS StackExchange에이 질문에 좋은 답변을했다 : /cs/2059/how-do-you-check-if-two-algorithms-return-the-same-result 모든 입력

이것은 모두 공식적인 방법프로그래밍 언어 의 우산에 해당 합니다 . 덴 타셔 널 시맨틱은 시맨틱을 모델링하기위한 한 가지 클래스의 기술이지만 운영 시맨틱과 비교하여 사용하기 어렵다는 선호에서 벗어났다.


답변 해주셔서 감사합니다! 이것은 내가 찾던 것입니다.
Matthijs Steen

4
나는 의미 상 의미론이 "선호하지 않았다"는 결정에 강력하게 동의하지 않는다. 그것은 당신이 누구에게 물어 보느냐에 달려 있습니다.
Andrej Bauer

5

Turing 완전한 프로그래밍 언어의 확장 평등은 일반적으로 결정하기 어렵지만 두 특정 기능이 확장 적으로 동일하다는 것을 확인하거나 위조하는 것을 막을 수는 없습니다.

검증은 여러 형태로 진행될 수 있으며, 예를 들어 연산 의미론을 사용하여 ZFC 이론에서 추론 할 수 있습니다. 그러나 그것은 고통 스러울 것입니다. dentational 의미론이 존재한다면, 그것들도 사용될 수 있지만, 좋은 denotational 의미론은 몇몇 언어에 대해서만 존재합니다. 일반적으로 프로그램 의 확장 평등을 보여주기 위해 Hoare logic과 같은 프로그램 로직을 사용 합니다. 이렇게하려면 함수가있는 언어의 Hoare 논리에 일반적으로 라는 공리가 필요합니다 , 그 가정 및 유형의 함수이다 (호어 로직의 선정 방법의 세부 공리 variy의 상세).f=gxα.f(x)=g(x)fgαβ


답변 해주셔서 감사합니다. Hoare 논리를 살펴 보겠습니다. Hoare 논리와 비교하여 dentotional 의미론을 정의하기 어렵습니까, 아니면 대부분의 언어에 적합하지 않습니까? 중단 문제로 인해 확장 평등이 일반적으로 결정 불가능합니까? 그렇다면 전체 기능 언어 에서처럼 기능이 항상 중단된다면 일반적으로 결정할 수 없습니까? 아니면 일반적으로 결정 불가능한 다른 이유가 있습니까?
Matthijs Steen

@ Matthijs Steen : 흥미로운 기능을 가진 프로그래밍 언어를위한 좋은 의미 론적 의미론은 찾아보기 힘들 것 같습니다. 대조적으로 Hoare 논리는 지난 10 년 동안 꽃을 피웠으며 이제는 거의 모든 프로그래밍 언어에 대해 논리를 구성 할 수 있습니다. 확장 평등은 결정 할 수 없기 때문에 (비트 단순화) 그렇지 않으면 임의의 프로그램 가 문맥 상 항상 종료 프로그램 인 과 동일한 지 여부를 확인할 수 있기 때문에 중지 문제의 변형입니다. 언어에 충분한 유한 조건을 던지면 결국에는 ... (계속)P0
Martin Berger

... 결정적인 맥락 평등이 있습니다. 그러나 R. Loader는 심지어 초소형 PCF조차도 결정 불가능한 맥락 적 동등성을 가지고 있음보여주었습니다 .
Martin Berger

-2

빠른 대답 (나는 많은 시간을 소비하지 않았다는 것을 인정한다 ...) 라이스 정리는 사소한 질문이 아니라면 프로그램에 의해 계산 된 함수가 속성을 가질 지 여부를 결정할 수 없다고 말한다. 그러므로 여기서 질문은 결정할 수 없습니다


1
"... 부분 함수 의 사소한 속성에 대해 ..."라고 말하지 않았으므로 전체 함수에 대해 결정할 수 없습니까?
Matthijs Steen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.