sicp.io
4.4.1 · 규칙 기반 질의

규칙은 질의 하나를 더 작은 목표들의 수열로 바꾼다.

유한 질의 평가기는 사실을 훑고 규칙을 펼친 뒤 각 목표에서 얻은 프레임을 다음 목표로 전달할 수 있습니다.

생각해 볼 질문

규칙은 다음 목표가 필요로 하는 중간 바인딩을 어떻게 보존할까요?

  • 사실과 질의와 변수와 규칙을 인용된 데이터로 표현하기
  • 일치하는 assertion마다 바인딩 프레임 하나씩 반환하기
  • 규칙 head를 본문 목표들의 순서 있는 수열로 펼치기
  • 성공한 모든 프레임을 다음 목표로 전달하기

첫 번째 프로그램은 parent 술어와 고정된 ada 위치를 각 assertion과 비교합니다. 일치할 때마다 child 바인딩 하나를 담은 프레임을 반환합니다. scan-assertions가 유한한 facts 리스트의 끝에 도달하므로 일치하는 두 프레임은 assertion 순서대로 남습니다.

두 번째 프로그램은 규칙 head에서 grand를 바인딩한 다음 solve-goals가 두 parent 목표를 순서대로 처리합니다. 첫 번째 목표는 중간 값 ben과 dia를 만듭니다. 각 프레임은 두 번째 목표의 입력이 되어 cy와 eli를 찾습니다. 이 수업의 평가기는 모든 중간 프레임을 보존하면서 직접적인 parent 사실과 하나의 순서 있는 parent 규칙 본문을 처리합니다.

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

    assertion 스캔은 (((child . ben)) ((child . dia)))를 반환합니다. 규칙 확장은 (cy eli)를 반환합니다.

    실행 추적에서 볼 점

    첫 번째 실행에서는 각 assertion 비교와 두 child 프레임 확장을 따라가세요. 두 번째 실행에서는 첫 번째 목표로 들어가는 grand 바인딩을 따라간 다음 child가 cy나 eli가 되기 전에 ben과 dia 중간 프레임이 각각 두 번째 목표로 전달되는지 확인하세요. 실행 흐름은 정확한 데이터베이스 스캔과 순서 있는 규칙 본문 평가를 기록합니다.

    직접 해보기

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

    (parent cy fox)를 추가한 다음 두 번째 질의를 (grandparent ben (var who))로 바꾸세요. 반환될 답을 예상하세요.

    힌트 보기

    첫 번째 목표가 middle을 cy에 바인딩하고 새 사실을 통해 두 번째 목표가 child를 fox에 바인딩할 수 있습니다.

    이 수업 완료하기

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