sicp.io
4.3.2 · amb 평가기 구현하기

실패는 저장해 둔 다음 대안을 다시 시작한다.

명시적인 평가기는 guest 평가 전체에 성공 continuation과 실패 continuation을 함께 전달할 수 있습니다. amb는 남은 선택을 실패 경로에 저장하고 require는 후보가 제약을 어기면 그 경로를 호출합니다.

생각해 볼 질문

평가기는 실패를 종료 오류가 아니라 이전 선택점의 다음 대안을 다시 시작하라는 요청으로 어떻게 바꿀까요?

  • 명시적인 성공·실패 continuation으로 guest 식 평가하기
  • 어휘 환경을 가진 guest 복합 프로시저 나타내기
  • 연산자와 피연산자 평가 전체에 대안 continuation 전달하기
  • 남은 선택으로 이어지는 실패 경로를 사용해 amb 구현하기
  • 술어가 거짓일 때 현재 대안을 호출해 require 구현하기
  • 모든 유한 해를 모으거나 명시적인 해 수 한도에서 멈추기
  • 빠진 대입 되돌리기와 공정성 정책을 경계로 남기기

ambeval은 expression과 environment와 succeed와 fail을 받습니다. 결정적인 식은 값과 함께 나중 일이 그 값을 거부할 때 사용할 실패 continuation을 succeed에 넘깁니다. amb 형식은 첫 선택을 평가하면서 실패 continuation을 남은 선택을 시도하는 프로시저로 바꿉니다. 피연산자 평가는 이 continuation을 왼쪽에서 오른쪽으로 이어 전달하므로 프로시저 본문의 실패가 앞에서 고른 비결정적 인자의 다음 값으로 돌아갈 수 있습니다.

require는 같은 continuation 체계 안에서 술어를 평가합니다. 참이면 ok로 성공하고 거짓이면 다음 술어 대안을 호출하며 결국 가장 가까운 amb 선택점으로 돌아갑니다. all-values는 성공마다 받은 다음 대안을 계속 호출합니다. 첫 실행은 선택한 유한 탐색을 모두 소진해 complete를 보고하고 두 번째는 해 네 개 뒤에 일부러 멈춰 truncated를 보고합니다. 수업용 평가기는 순서가 있는 amb 선택과 require와 프로시저 적용과 성공 또는 실패 continuation 이동을 다룹니다.

SICP 코드UTF-8 7,667 / 1,048,576바이트
예제
결과
출력
진단
실행 추적0 / 0 개 이벤트
    실행은 브라우저 안에서 이루어지며 프로그램 결과와 실행 추적을 보여줍니다.
    예상 결과

    순서쌍 탐색은 (complete ((1 4) (2 3)))을 반환합니다. 한도를 둔 세 수 탐색은 (truncated ((1 2 3) (1 2 4) (1 2 5) (1 3 4)))를 반환합니다.

    실행 추적에서 볼 점

    각 amb 선택이 남은 선택을 위한 실패 continuation을 설치하는 곳을 찾으세요. 그다음 본문의 require가 후보를 거부할 때 get-arguments가 뒤의 third 인자와 second 인자와 first 인자의 다음 대안으로 차례로 돌아가는 과정을 따라가세요. 탐색은 해가 소진되거나 설정한 해 수 한도에 도달할 때 멈춥니다.

    직접 해보기

    프로그램을 수정하고 결과를 비교해 보세요.

    순서쌍 프로그램의 left와 right를 1부터 6에서 고르고 곱이 12이며 left가 더 작은 모든 해를 모으도록 바꾸세요. 실행 전에 해의 순서를 예상하세요.

    힌트 보기

    왼쪽에서 오른쪽으로 진행하는 amb 순서는 left가 1일 때 모든 right를 시험한 뒤 left 2로 이동합니다. 두 require를 모두 만족하는 순서가 있는 약수쌍만 남습니다.

    이 수업 완료하기

    이 장의 총 23개 수업 중 0개 완료0%