문법을 읽고 문맥을 전달하고 제어를 명시하세요.
정본 수업 프로그램 스물세 개로 표현식 데이터와 어휘 환경, 평가기 레코드, 소스 변환, 분석된 실행, 엄격·지연 전략, 비결정적 continuation, 프레임 스트림, unification, 규칙 탐색, 모든 유한 관찰의 정확한 입력 및 자원 경계를 다시 연결합니다.
표현된 프로그램 하나가 문법 분류와 환경 조회와 프로시저 적용과 지연된 요구와 대안 continuation과 질의 프레임 확장을 거치는 과정을 교육용 모형과 실제 리스펙스 런타임을 혼동하지 않고 설명할 수 있나요?
- 인용된 표현식 트리를 데이터로 해석하기
- 환경마다 같은 기호를 다른 값에 연결하기
- 특수 형식에서 선택한 가지만 평가하기
- 구조를 한 번 분석하고 실행 계획 재사용하기
- let을 기존 lambda 적용 규칙으로 바꾸기
- 명시적인 thunk를 한 번 force하고 메모이즈하기
- 성공한 모든 유한 대안 유지하기
- 일관된 패턴 바인딩만 프레임에 넣기
- 유한 규칙 목표 사이에서 프레임 전달하기
- 재귀 검색을 frontier와 함께 complete 또는 truncated로 보고하기
- 실패한 조회와 부정, 선언적 관계와 실행 탐색을 구분하기
- 내부 이름을 먼저 만들고 대입으로 서로 재귀적인 프로시저 값을 설치하기
- 인용된 최상위 형식을 eval/apply로 실행하며 하나의 전역 환경에 정의 남기기
- 성공·실패 continuation을 전달해 require가 앞선 amb 선택으로 돌아가게 하기
- eval의 문법 디스패치와 apply의 프로시저 디스패치 분리하기
- 프레임과 환경 사슬과 원시·복합 프로시저와 인자 목록 구성하기
- 프로그램 데이터를 만들고 살펴보고 바꾸고 평가하기
- 적용적 순서와 메모이즈하지 않은 정상 순서 일정 비교하기
- 복합 프로시저 인자를 늦추고 요구한 값을 메모이즈하는 지연 평가기 실행하기
- guest 언어 안에서 끝없는 지연 리스트를 만들고 유한한 앞부분만 요구하기
- 유한한 퍼즐을 선택과 제약으로 표현하고 해의 순서 살펴보기
- 질의를 입력 프레임 스트림에서 출력 프레임 스트림으로 가는 변환으로 읽기
- 규칙 변수를 새 이름으로 바꾸고 항을 통합하며 규칙 깊이 한도 적용하기
앞쪽 수업은 표현 경계를 세웁니다. 표현식과 환경과 프로시저 레코드와 변환한 소스는 유한한 수업용 평가기에 주는 보통 데이터이며 각 수업은 모형에 들어간 문법과 자료구조를 분명히 밝힙니다.
조립된 eval/apply 수업은 이 조각을 연결합니다. eval은 소스 형식을 분류하고 apply는 원시·복합 프로시저를 구분하며 프레임은 가변 바인딩을 저장하고 클로저는 어휘 환경을 남기며 유한 드라이버는 최상위 형식 사이에 guest 전역 환경을 보존합니다.
평가 순서 묶음은 제어 프로토콜을 바꿉니다. 엄격한 일정은 적용 전에 피연산자를 계산하고 정상 순서 모형은 메모이즈하지 않은 채 늦춥니다. 지연 평가기는 식과 환경을 thunk에 저장하고 요구한 thunk를 값으로 바꾸며 지연 리스트 수업은 보통 guest 프로시저로 비엄격 리스트 생성자를 정의합니다.
비결정적 묶음은 성공과 실패 continuation을 함께 전달합니다. amb는 남은 선택을 실패 경로에 저장하고 require는 제약이 실패하면 그 경로를 호출하며 퍼즐 수업은 같은 평가기 프로토콜로 유한한 해를 보이는 순서로 열거합니다.
논리 프로그래밍 묶음은 assertion과 and·or·rule 사이로 프레임을 전달합니다. 구현 수업은 양방향 unification과 새 규칙 변수 이름을 더하며 명시적인 작업·깊이 한도가 미완료 또는 순환 탐색을 완전한 답처럼 보이지 않게 합니다.
스물세 프로그램의 고정 한도의 실행 흐름은 교육용 평가기와 질의 시스템에서 선택한 한 실행의 정확한 사건을 기록합니다.
- 출력
- —
- 값
- —
- 진단
- —
각 프로그램은 대응하는 제4장 수업의 첫 예상 관찰을 반환합니다. 유한 드라이버는 (complete ((defined square) (defined make-adder) (defined add-five) (defined base) 49 12 (assigned base) 81 6) 0)을 반환하고 amb 평가기의 제약 쌍 탐색은 (complete ((1 4) (2 3)))을 반환합니다. 새 수업들은 평가기 레코드, 생성한 프로그램 데이터, 엄격·지연 작업 수, 메모이즈된 요구, 유한한 지연 리스트 앞부분, 퍼즐 해의 순서, 프레임 스트림 변환, 작업 예산 아래의 규칙 확장을 추가로 드러냅니다.
표현식 순회, 가까운 프레임 조회, 분기, 분석, 소스 변환, 원시·복합 적용, 인자 목록 순서, thunk 생성과 메모이제이션, 요구한 지연 리스트 항목, amb 선택 저장, require 실패, 퍼즐 되돌아가기, 프레임 확장, assertion 스캔, and 목표 전달, 규칙 변수 이름 변경, unification, 예산 감소를 따라가세요. 실행 흐름은 선택한 실행을 고정 런타임 한도 아래에서 정확히 기록합니다.
평가기와 지연된 작업과 대안과 질의를 생각하는 질문 스물세 개
표현식 데이터를 값으로 바꾸려면 평가기는 무엇을 해야 할까요?
정답 수는 직접 평가됩니다. 복합 식은 그 값을 결합하기 전에 중첩된 두 피연산자를 해석하도록 evaluate에 요청합니다. 평가기는 식 트리를 한 번에 노드 하나씩 따라갑니다.
같은 표현식이 다른 환경에서 다른 값을 만드는 이유는 무엇일까요?
정답 evaluate는 x나 y에 영구적인 의미 하나를 붙이지 않습니다. 식과 함께 환경을 전달받으므로 같은 식 트리를 서로 다른 바인딩으로 재사용할 수 있습니다.
평가기가 if의 두 가지를 모두 평가하면 무엇이 잘못될까요?
정답 첫 번째 예제에서 대안은 0으로 나눕니다. 참인 술어가 덧셈 갈래를 선택하고 유효하지 않은 대안은 식 데이터로 남아 있으므로 프로그램은 여전히 60을 반환합니다.
환경이 오기 전에 어떤 일을 미리 끝낼 수 있을까요?
정답 그 결과로 나온 plan은 환경을 받습니다. 이를 실행하면 변수를 조회하고, 저장된 피연산자 계획을 실행하며, 이미 선택된 연산자를 적용하기만 합니다. 따라서 분석된 하나의 plan으로 여러 환경을 처리할 수 있습니다.
let을 lambda 적용으로 바꿀 때 무엇이 그대로 남아야 할까요?
정답 평가기는 지역 바인딩을 위한 두 번째 구현이 필요하지 않습니다. let 경우는 식을 다시 쓰고 그 결과를 같은 환경의 일반적인 lambda와 적용 경우로 다시 보냅니다.
call-by-need를 평가기 안에서 보이게 하는 표현 변화는 무엇일까요?
정답 force-it은 태그를 검사합니다. 첫 번째 요구에서는 저장된 계산을 호출하고 태그를 evaluated-thunk로 바꾸며 계산을 버리고 값을 저장합니다. 이후의 요구는 캐시된 슬롯을 선택하며 계산을 다시 수행하지 않습니다. 이는 게으른 평가기가 평소에 인자 처리 뒤에 숨겨 두는 표현 변화를 드러냅니다.
성공 하나 뒤에도 남은 대안을 유지하면 평가가 어떻게 달라질까요?
정답 두 번째 프로그램은 두 선택 위치를 명시적으로 드러냅니다. scan-y는 하나의 x에 대해 모든 y를 검사하고, scan-x는 모든 x에 대해 그 작업을 반복합니다. 제곱의 합이 25가 되는 모든 쌍을 반환하는 과정은 유한한 비결정적 탐색을 리스트를 생성하는 평범한 제어로 드러냅니다.
매처는 두 데이터 구조를 걸으며 부분 지식을 어떻게 전달할까요?
정답 다음에 다시 나타나면 프레임을 확장하기 전에 기존 바인딩을 먼저 조회합니다. 데이터가 같으면 프레임을 유지하고, 데이터가 충돌하면 failed를 반환하여 남은 모든 재귀 단계로 전파합니다. 이는 패턴에 있는 변수를 기준으로 일관된 프레임 바인딩을 구성하는 단방향 매칭을 수행합니다.
규칙은 다음 목표가 필요로 하는 중간 바인딩을 어떻게 보존할까요?
정답 두 번째 프로그램은 규칙 head에서 grand를 바인딩한 다음 solve-goals가 두 parent 목표를 순서대로 처리합니다. 첫 번째 목표는 중간 값 ben과 dia를 만듭니다. 각 프레임은 두 번째 목표의 입력이 되어 cy와 eli를 찾습니다. 이 수업의 평가기는 모든 중간 프레임을 보존하면서 직접적인 parent 사실과 하나의 순서 있는 parent 규칙 본문을 처리합니다.
데이터에 순환이 있어도 재귀 규칙 확장을 정직하게 끝내려면 무엇이 필요할까요?
정답 두 번째 프로그램은 세 사람으로 이루어진 순환을 사용합니다. ada를 펼치면 ben에 닿고, ben은 cy에 닿으며, cy는 다시 ada에 닿습니다. 평가기는 제거된 frontier 항목마다 정확히 하나의 작업 단위를 사용하며 예산이 0에 도달하면 남은 frontier와 함께 truncated를 반환합니다. 이 너비 우선 수업 모델은 parent 확장과 명시적인 frontier와 반복되는 답과 complete 또는 truncated 상태를 다룹니다.
어떤 결론은 논리 관계에서 나오고 어떤 결론은 특정 데이터베이스와 탐색 절차에서 나올까요?
정답 두 번째 프로그램은 married 관계에 대칭 탐색 규칙을 붙입니다. 직접 사실이 없으면 인자를 바꾸어 다시 찾습니다. 이 규칙은 반대 방향 사실이 있는 (married mickey minnie)를 한 번 뒤집어 유도합니다. 관련 없는 두 사람은 반복 탐지를 하거나 작업 예산을 쓰지 않으면 같은 두 질의를 끝없이 왕복합니다. 논리 관계가 대칭이어도 규칙의 방향과 제어가 실제 탐색의 동작을 결정합니다.
평가기는 왜 프로시저 값을 하나라도 설치하기 전에 내부 바인딩을 모두 먼저 만들어야 할까요?
정답 두 번째 프로그램은 두 형태를 실제로 실행합니다. classify-original은 내부 정의를 그대로 사용하고 classify-scanned는 변환된 let과 set! 구조를 명시적으로 씁니다. 7과 8에서 같은 결과가 나오며 equal?은 참을 보고합니다. 이 유한 비교는 화면에 나온 변환과 입력의 일치를 확인하고 중간 구조를 직접 드러냅니다.
평가기 프로시저 모음을 사용자 형식의 수열을 실행하는 하나의 프로그램으로 만드는 것은 무엇일까요?
정답 run-program이 드라이버입니다. 인용된 최상위 형식과 하나의 전역 환경과 형식 예산을 받습니다. 끝난 형식마다 transcript 값 하나를 남기며 정의와 대입은 뒤 형식에서도 보입니다. 전체 실행은 square와 make-adder와 add-five와 base를 정의합니다. add-five는 전역 base가 바뀐 뒤에도 지역 x 값 5를 유지합니다. 두 번째 실행은 다섯 형식 뒤에 멈추고 형식 네 개가 남았다고 보고합니다. 이 형식 예산은 한 형식 안의 재귀나 작업량을 제한하지 않으며 그 아래 실행 경계는 패키지된 브라우저 런타임이 담당합니다.
평가기는 실패를 종료 오류가 아니라 이전 선택점의 다음 대안을 다시 시작하라는 요청으로 어떻게 바꿀까요?
정답 require는 같은 continuation 체계 안에서 술어를 평가합니다. 참이면 ok로 성공하고 거짓이면 다음 술어 대안을 호출하며 결국 가장 가까운 amb 선택점으로 돌아갑니다. all-values는 성공마다 받은 다음 대안을 계속 호출합니다. 첫 실행은 선택한 유한 탐색을 모두 소진해 complete를 보고하고 두 번째는 해 네 개 뒤에 일부러 멈춰 truncated를 보고합니다. 수업용 평가기는 순서가 있는 amb 선택과 require와 프로시저 적용과 성공 또는 실패 continuation 이동을 다룹니다.
어떤 책임이 eval에 있고 어떤 책임이 apply에 있으며 어떤 데이터 구조가 둘을 연결할까요?
정답 apply-procedure는 소스 문법을 살피지 않습니다. 호스트 프로시저는 apply를 통해 인자 목록을 받고, compound-procedure 레코드는 매개변수와 본문 식과 생성 환경을 제공합니다. 적용은 그 환경에 새 프레임을 연결하고 본문 수열을 평가합니다. 재사용한 canonical driver는 하나의 지속 guest 환경에서 교육용 평가기의 핵심 형식을 모두 실행합니다.
프로시저를 나중에 생성 환경에서 적용하려면 평가기가 어떤 정보를 유지해야 할까요?
정답 두 번째 프로그램은 호스트 + 프로시저를 primitive 데이터로 태그하고 구현을 꺼낸 뒤 적용합니다. list-of-values는 명시적인 probe로 왼쪽부터 인자 평가 순서를 기록합니다. guest true?는 #f를 거짓으로 보므로 0과 인용한 기호는 참입니다. 이 레코드들은 프레임과 프로시저와 인자와 참 판정을 위한 수업용 평가기 규약을 이룹니다.
평가기가 보통 프로시저도 만들고 바꿀 수 있는 같은 리스트 구조를 받아들이면 무엇이 가능해질까요?
정답 두 번째 프로그램은 이차식을 데이터로 다루고 기호 x를 재귀적으로 3으로 바꿉니다. 변환 자체는 산술을 수행하지 않습니다. arithmetic-eval이 나중에 +와 *를 해석하여 16을 만듭니다. 이 유한 평가기는 나열된 산술 폼을 처리하며 생산자와 변환기와 평가기 사이의 명시적 표현 연결을 보여 줍니다.
평가기 두 개가 같은 값을 반환하면서도 서로 다른 인자 작업을 수행할 수 있는 이유는 무엇일까요?
정답 두 번째 식은 본문에서 x를 두 번 사용합니다. strict 평가는 probe를 한 번 계산하고 결과 10을 바인딩합니다. 메모이즈하지 않은 정상 평가기는 조회마다 저장한 식을 강제하므로 probe를 두 번 실행합니다. 둘 다 20을 반환하지만 작업량은 다릅니다. 두 평가기는 명시적인 guest 모형이며 실행 중인 호스트 리스펙스의 평가 순서를 바꾸지 않습니다.
평가기는 인자 작업을 미루면서도 같은 식을 여러 번 참조할 때 되풀이 계산하지 않도록 어떻게 만들까요?
정답 force-it은 새 thunk를 한 번 평가한 뒤 같은 가변 레코드를 evaluated-thunk로 바꾸고 결과를 저장하며 식과 환경을 버립니다. 사용하지 않은 인자는 probe를 실행하지 않고 x를 두 번 써도 probe는 한 번뿐입니다. 선택되지 않은 if 갈래도 평가되지 않습니다. 이 수업의 call-by-need 모형은 나열한 형식의 지연 평가 과정을 직접 실행합니다.
평가기가 모든 compound procedure 피연산자를 자동으로 지연하면 리스트 추상화는 어떻게 달라질까요?
정답 integers-from과 lazy-map도 보통 재귀 문법을 사용합니다. 재귀 호출은 lazy-cons의 지연된 y 피연산자이므로 무한한 나머지가 평가기 thunk로 표현됩니다. take는 요구 경계입니다. primitive cons는 실제 인자가 필요하므로 요청한 수만큼만 머리와 꼬리를 강제해 유한 호스트 리스트를 만듭니다. 이 예제는 수업 평가기와 리스트를 통합하고 요청한 앞부분의 강제 과정을 기록합니다.
프로그램은 올바른 답을 설명하고 continuation 프로토콜은 대안 순서와 backtracking을 소유하도록 어떻게 나눌 수 있을까요?
정답 피타고라스 프로그램은 숫자 선택에 같은 continuation을 재사용합니다. 순서 제약이 순열을 없애고 제곱 등식이 1부터 10까지에서 두 삼쌍을 받아들입니다. 두 예제는 유한 리스트를 깊이 우선으로 탐색하고 선택한 범위에서 도달한 모든 선택을 기록합니다.
질의 하나가 가능한 변수 바인딩을 보존하면서 뒤 질의가 일치하는 프레임을 어떻게 가려낼까요?
정답 qeval은 and를 파이프라인으로 알아봅니다. 첫 질의가 programmer마다 가능한 who 프레임을 만들고 둘째 질의는 각 프레임을 따로 받아 같은 who가 bob 아래 supervisor인 경우만 남깁니다. 이 수업은 유한 프레임 스트림을 리스트로 구체화하면서 파이프라인 프로토콜을 보존합니다.
저장된 사실뿐 아니라 재사용 가능한 rule에서 도출한 결론에도 질의를 맞추려면 어떤 장치가 더 필요할까요?
정답 simple-query는 직접 assertion 성공과 rule 결과를 합칩니다. rule 결과는 질의 패턴과 이름을 바꾼 결론을 unify한 뒤 그 프레임을 rule 본문의 qeval로 넘깁니다. and는 프레임을 파이프라인으로 전달하고 or는 대안을 합치며 not은 같은 프레임에서 하위 질의 결과가 없을 때만 프레임을 남깁니다. 명시적인 깊이는 rule 확장을 제한하는 정확한 유한 자원 경계입니다.