Skip to main content
QUICK REVIEW

[논문 리뷰] More declarative tabling in Prolog using multi-prompt delimited control

Samer Abdallah|arXiv (Cornell University)|2017. 08. 23.
Logic, programming, and type systems참고 문헌 7인용 수 3
한 줄 요약

이 논문은 존슨의 기능적 메모이징 파서 조합자에서 영감을 얻어, 다중 프롬프트 분리 제어를 사용한 Prolog 테이블링의 더 선언적인 접근 방식을 제시한다. 이는 최소한의 코드로 증분적 해답 제공을 달성하며, 최적화된 기존 시스템과 비교해 성능이 약 2배 이내로 유지되며, SWI Prolog의 계속성 기반 제어 연산자를 통해 Prolog의 선언적 스타일을 유지한다.

ABSTRACT

Several Prolog implementations include a facility for tabling, an alternative resolution strategy which uses memoisation to avoid redundant duplication of computations. Until relatively recently, tabling has required either low-level support in the underlying Prolog engine, or extensive program transormation (de Guzman et al., 2008). An alternative approach is to augment Prolog with low level support for continuation capturing control operators, particularly delimited continuations, which have been investigated in the field of functional programming and found to be capable of supporting a wide variety of computational effects within an otherwise declarative language. This technical report describes an implementation of tabling in SWI Prolog based on delimited control operators for Prolog recently introduced by Schrijvers et al. (2013). In comparison with a previous implementation of tabling for SWI Prolog using delimited control (Desouter et al., 2015), this approach, based on the functional memoising parser combinators of Johnson (1995), stays closer to the declarative core of Prolog, requires less code, and is able to deliver solutions from systems of tabled predicates incrementally (as opposed to finding all solutions before delivering any to the rest of the program). A collection of benchmarks shows that a small number of carefully targeted optimisations yields performance within a factor of about 2 of the optimised version of Desouter et al.'s system currently included in SWI Prolog.

연구 동기 및 목표

  • 낮은 수준의 엔진 수정이나 복잡한 프로그램 변환 없이, 분리 제어 연산자를 활용해 Prolog 테이블링을 더 선언적으로 구현하는 것.
  • 모든 해답을 전부 반환하기 전에 해답을 미리 제공할 수 있도록, 테이블링된 술어에서 증분적 해답 제공을 가능하게 하는 것.
  • 기존 최적화된 테이블링 시스템과 경쟁 가능한 성능을 달성하면서도 코드의 단순성과 Prolog의 선언적 핵심 원칙을 유지하는 것.
  • 최소한의 대상 최적화로 현재 SWI Prolog 테이블링 구현체와 비교해 약 2배 이내 성능을 달성할 수 있음을 보여주는 것.

제안 방법

  • 존슨의 기능적 메모이징 파서 조합자를 계속성 전달 스타일과 분리 제어를 사용해 순수한 선언적 Prolog로 변환하는 것.
  • 스키리버스 등(2013)이 제안한 SWI Prolog의 다중 프롬프트 분리 제어 연산자(다중 프롬프트 분리 제어)를 사용해 계산 스레드를 일시정지하고 재개함으로써, 효율적인 메모이제이션과 테이블링을 가능하게 하는 것.
  • 테이블링 동작을 위해 호출을 `cctable/1` 메타콜로 감싸고 술어 이름을 바꾸는 `table` 지시어를 통한 얕은 프로그램 변환을 도입하는 것.
  • SWI Prolog의 `rbtrees`를 통해 레드_blk 트리를 사용하고, 스토어 추상화를 도입해 메모이제이션 테이블과 가변 상태를 통제 가능한 방식으로 관리하는 것.
  • 키 재사용과 효율적인 참조 관리와 같은 대상 최적화를 적용해, 선언적 성격을 훼손하지 않으면서 성능을 향상시키는 것.
  • 변수를 포함한 항들에 대해서도 정확하게 동작하는 키 매칭을 위해 `tries` 라이브러리를 활용하는 것.

실험 결과

연구 질문

  • RQ1낮은 수준의 엔진 지원 없이도, 고수준의 제어 연산자만을 사용해 Prolog의 테이블링을 더 선언적으로 구현할 수 있는가?
  • RQ2분리 제어를 사용해 테이블링된 Prolog에서 증분적 해답 제공이 가능해지며, 비결정적 쿼리에서 반응성을 향상시킬 수 있는가?
  • RQ3계속성 기반 테이블링 시스템의 성능은 SWI Prolog에서 매우 최적화된 저수준 테이블링 구현체와 비교해 어떻게 되는가?
  • RQ4최소한의 코드 기반과 선언적 스타일을 유지하면서도, 경쟁 가능한 성능을 달성할 수 있는 정도는 어느 정도인가?

주요 결과

  • 제안된 테이블링 시스템은 해답을 증분적으로 제공하여, 전체 해답을 전부 세는 데서 기다리지 않고도 조기에 결과에 접근할 수 있도록 한다.
  • 이전의 계속성 기반 접근 방식보다 훨씬 적은 코드로 구현되며, Prolog의 선언적 핵심에 훨씬 더 가까이 유지된다.
  • 소수의 대상 최적화만으로도 현재 최적화된 SWI Prolog 테이블링 구현체와 비교해 약 2배 이내의 성능를 달성한다.
  • 다중 프롬프트 분리 제어의 사용은 계산 스레드의 효율적 일시정지와 재개를 가능하게 하여, OLDT 및 SLG 해석의 동작을 효과적으로 모델링한다.
  • 계속성 기반 메모이제이션을 활용해 왼쪽 재귀 및 비결정적 술어를 정확히 처리하며, 이는 이어리 메모이제이션과 기능적 파서 조합자와 유사하다.
  • `table/1` 지시어를 통한 얕은 프로그램 변환은 기존 Prolog 코드와의 투명한 통합을 가능하게 하며, 모듈성과 사용 편의성을 유지한다.

더 나은 연구,지금 바로 시작하세요

논문 읽기부터 검토까지, 연구 시간을 획기적으로 줄여보세요.

카드 등록 없음 · 무료 플랜 제공

이 리뷰는 AI가 만들고, 인간 에디터가 검토했습니다.