Scheme의 call / cc는 알려진 모든 제어 흐름 구조를 구현할 수 있습니까?


13

페이지 "고급 계획 : 일부 장난 꾸러기 비트" 상태 :

연속은 거의 모든 다른 제어 흐름 구조 [...]가 도출 될 수 있는 강력한 제어 흐름 구조입니다.

call/ccPeter Landin의 J 연산자와 관련된 Scheme이 알려진 제어 흐름 구조 를 구현 하는 데 사용될 수 있다고 생각 했습니까?

"제어 흐름 구조" 를 사용하여 예외, 코 루틴, 녹색 스레드 등 Wikipedia의 설명 에 대해 구체적으로 생각 하고 있습니다.

구체적으로 ?를 사용하여 구현할 수없는 제어 흐름 구조의 예가 call/cc있습니까?

(*) 나는 call/ccJ 연산자만큼 강력한 종이를 파낼 수 없었습니다 . Felleisen의 논문 (이 글을 읽고 완전히 이해하는데 어려움을 겪지 않은 논문 )이 이것을 조사하고, 그것들이 다른 복잡성 클래스에 있지만 공식적으로 동등하다고 결론을 내릴 것 같습니다.

(또한 아래 의견에 따라 질문을 업데이트했습니다.)

최신 정보

아래 @Neel의 탁월한 대답을 바탕으로, 구분 및 무제한 연속에 대해 언급 한 사이트를 살펴 보았지만 실제로 call/cc는 무제한이지만 충분하지 않은 것으로 보입니다 . 한편, 일류 구분 (같은 연속 요청이 shift/reset) 있는 제어 흐름 구조를 표현하는 보인다 사용될.


5
"제어 흐름 구조"의 공식적인 정의는 무엇입니까?
Huck Bennett

4
다시 : 무제한 연속. Hayo Thielecke의 참고 논문을 읽었습니까? 실제 주장은 국가의 부재 하에서 제공되는call/cc 무제한 연속 예외 표현할 수 없다는 것이다. (Tileecke가 지적한대로, 예외는 프로그램과 예외 처리기를위한 두 가지 연속체를 전달하여 구현할 수 있지만, 그 이상은 필요 이상 call/cc입니다.)
rici

@Rici : 처음 몇 페이지 만 감추었습니다. (논문을 읽는 데 시간 이 오래 걸립니다). 의견 주셔서 감사합니다!
csl

@HuckBennett 공식적인 정의는 없지만 비공식적으로 en.wikipedia.org/wiki/Control_flow에 설명 된 내용을 의미합니다. 특히 연속을 사용하여 코 루틴을 표현하고 더 중요하게 구현할 수 있습니다. 녹색 스레드, 예외, 이스케이프 명령문,- amb연산자 등.
csl

2
@csl "제어 흐름 구조"의 의미를보다 정확하게 만드는 것 외에도 무언가를 "표현"하는 것이 무엇인지 더 명확해야합니다. 이것은 어려운 문제이며 질문에 대한 답변은 표현으로 세는 내용에 따라 크게 다릅니다. 결국 예외 (예 : Java)가있는 언어의 인터프리터를 인코딩하는 Turing 머신을 항상 코딩 할 수 있습니다. 그러나 그것은 아마도 당신이 생각하고있는 것이 아닐 것이므로, "표현"의 개념 (예 : 구성 성 및 / 또는 완전한 추상화)에 강한 제약을 두어야합니다.
Martin Berger

답변:


11

이 답변에서는 Felleisen 1991, 프로그래밍 언어의 표현력 에 대한 의미에서 "매크로 표현 가능"을 의미하는 "표현 가능"을 사용합니다 . 직관적으로 전체 프로그램 변환을 사용하지 않고 언어 소스를 로컬 소스 변환으로 정의 할 수 있으면 언어 기능을 매크로로 표현할 수 있습니다.

이 정의를 사용하면 대답은 ' 아니오'입니다 . 구분 제어는 람다 미적분 + call / cc에서 매크로로 표현할 수 없습니다. call / cc를 사용하여 구분 된 제어 연산자를 표현합니다. 제어 구분 기호 (시프트 / 리셋의 재설정 부분)를 구현하려면 연속 표시를 시뮬레이션하는 기본 상태가 필요합니다. 기본적으로 연속 표시의 동적 수명을 시뮬레이트하기 위해 스택을 인코딩해야합니다.

그러나 구분 된 제어는 다음과 같은 의미에서 보편적 인 효과입니다. 그의 박사 논문 에서 Andrzej Filinski 는 구분 가능한 연속 또는 call / cc 및 단일 상태 셀을 사용하여 표현 가능한 부작용을 인코딩 할 수 있음을 보여주었습니다. 대략적으로 "표현 가능한 부작용"은 프로그래밍 언어의 유형에 따라 모나 딕 유형을 정의 할 수있는 모든 효과입니다.

놀랍게도이 아이디어는 실제로는 매우 흥미로운 것 같습니다. 지난 10 년 동안 Gordon Plotkin과 John Power는 효과 이론 의 대수적 의미론 을 취한다는 아이디어를 옹호했습니다. 아이디어 는 관심있는 부작용 효과 와 만족할 것으로 예상되는 방정식을 지정한다는 것입니다. 일반적으로이 이론에 대해 자유 모나드를 취함으로써 의미론을 얻을 수 있습니다.

Matija Pretnar와 Andrej Bauer는 이러한 수학적 접근 방식을 취한 후 Eff 언어 로 구현하여 "효과 처리기"라는 새로운 언어 구조를 개발했습니다. 일련의 명령 기능을 사용하는 코드를 작성하고 명령 기능에 의미를 부여 할 수 있습니다. 각 효과적인 작업을 구현하는 방법을 말하는 일련의 처리기를 작성하여.


그러나 정의가 " 에뮬레이션없이 Scheme 및 call / cc를 사용하여 제어 흐름 구조를 구현할 수 있습니까 "인 경우 대답은 ' 예' 여야합니다 . LtU 토론 lambda-the-ultimate.org/node/966 을 보면 Oleg Kiselyouv가 Scheme에서 4 개의 F 연산자를 call / cc로 구현 한 것으로 보입니다 : okmij.org/ftp/continuations/…- 발췌문 "코드는 무제한 연속을 캡처하기위한 call / cc에서, 하나의 글로벌 가변 셀을 사용합니다. 이것은 다른 F 연산자를 구현하기에 충분하지 않습니다. " ... "-F-에서 + F + F까지".
csl

Felleisen의 "매크로 표현성"을 답의 틀로 사용하고 있음을 인정합니다. 그러나 이미 알 수 있듯이 "call / cc를 사용하여 [구체적으로 구현"을 의미하도록 내 질문을 이미 변경했습니다. 그리고 Oleg Kiselyov는 한정된 연속을 위해 4 명의 F 연산자를 모두 구현하기 위해 글로벌 가변 셀을 도입해야하지만, 이것이 실제로 "프로그램의 주요 글로벌 구조 조정"에 해당한다고 생각하지는 않습니다.
csl

이 답변을 수락하겠습니다. 또한 추가 포인터가 있는 okmij.org/ftp/continuations/undelimited.html#delim-vs-undelim 의 텍스트를 가리키고 싶습니다 . 또한 시프트 / 리셋과 같은 일류의 구분 된 연속을 사용하여 제어 흐름 구조를 구현할 있습니다. "일류로 구분 된 연속체는 예외 및 변경 가능한 상태를 포함하여 표현 가능한 계산 효과를 표현할 수 있습니다."
csl
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.