sicp.io
4.4.6 · 질의 시스템 구현

unification은 assertion과 이름을 바꾼 rule을 하나의 프레임 프로토콜로 잇는다.

양쪽 변수 unification, rule 변수 이름 바꾸기, assertion·rule 탐색, conjunction, disjunction, negation-as-failure, instantiate, 명시적인 rule 깊이 예산을 구현합니다.

생각해 볼 질문

저장된 사실뿐 아니라 재사용 가능한 rule에서 도출한 결론에도 질의를 맞추려면 어떤 장치가 더 필요할까요?

  • 비교 양쪽에 나타난 변수 unify하기
  • 프레임을 확장하기 전에 기존 변수 바인딩 따라가기
  • 적용할 때마다 rule의 모든 변수 새 이름으로 바꾸기
  • rule 결론을 unify한 뒤 본문을 평가하여 rule 적용하기
  • 프레임 목록 위에서 and·or·유한 negation-as-failure 합성하기
  • 남은 깊이를 명시하여 재귀 rule 적용 제한하기

unify-match는 단순 assertion matching을 일반화합니다. 어느 쪽도 변수가 될 수 있고 기존 바인딩은 비교가 끝나기 전에 또 다른 변수나 구조로 이어질 수 있습니다. rule을 적용할 때마다 rename-rule은 각 논리 변수를 현재 rule 적용 id를 가진 새 키로 바꿉니다. 이로써 rule의 비공개 중간 이름이 질의 변수나 같은 rule의 다른 적용과 충돌하지 않습니다.

simple-query는 직접 assertion 성공과 rule 결과를 합칩니다. rule 결과는 질의 패턴과 이름을 바꾼 결론을 unify한 뒤 그 프레임을 rule 본문의 qeval로 넘깁니다. and는 프레임을 파이프라인으로 전달하고 or는 대안을 합치며 not은 같은 프레임에서 하위 질의 결과가 없을 때만 프레임을 남깁니다. 명시적인 깊이는 rule 확장을 제한하는 정확한 유한 자원 경계입니다.

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

    엔진은 (((grandchild carol) (grandchild dave)) (dave) 2)를 반환합니다.

    실행 추적에서 볼 점

    질의 패턴이 직접 assertion matching과 이름을 바꾼 각 rule 결론으로 들어가는 경로를 따라가세요. grandparent 본문이 conjoin으로 들어가기 전에 fresh 변수 키를 살펴보세요. 부정한 parent 질의에서 carol은 거부되고 dave는 남는 이유를 찾고 or 두 갈래가 같은 빈 입력 프레임에서 시작하는지 확인하세요.

    직접 해보기

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

    직접 parent 절과 재귀 절을 가진 ancestor rule을 추가하세요. 깊이 4와 깊이 1로 각각 실행해 답을 따로 보고하고 작업 예산이 결과 전선을 어떻게 정하는지 설명하세요.

    힌트 보기

    같은 ancestor 결론을 가진 rule 두 개를 사용하세요. 재귀 본문은 새 중간 변수 하나를 만들고 남은 깊이로 ancestor를 다시 호출해야 합니다.

    이 수업 완료하기

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