소개

소개

GNU Prolog [5]는 유한 도메인(finite domain)에 대한 제약 해결(constraint solving) 기능을 갖춘 무료 Prolog 컴파일러예요.

출처: GNU Prolog Manual - Introduction

본문

GNU Prolog [5]는 유한 도메인에 대한 제약 해결 기능이 있는 무료 Prolog 컴파일러예요. GNU Prolog에 대한 최신 정보는 GNU Prolog 페이지를 참고하세요.

GNU Prolog는 Warren Abstract Machine(WAM) [9, 1]을 기반으로 한 Prolog 컴파일러예요. 먼저 Prolog 프로그램을 WAM 파일로 컴파일하고, 이를 GNU Prolog를 위해 특별히 설계된 mini-assembly라는 저수준·기계 독립적인 언어로 번역해요. 그 결과물은 다시 대상 머신의 어셈블리 언어로 번역되어(이로부터 오브젝트를 얻음) 최종 실행 파일이 만들어져요. 이를 통해 GNU Prolog는 Prolog 소스에서 네이티브 스탠드얼론(stand alone) 실행 파일을 만들 수 있어요(C 컴파일러가 C 프로그램으로 그렇게 하듯이).

이 컴파일 방식의 주요 장점은 네이티브 코드를 만들고 빠르다는 거예요. 또 한 가지 흥미로운 특징은 실행 파일이 작다는 점이에요. 실제로 사용되지 않는 대부분의 내장 술어 코드는 링크 시점에 실행 파일에 포함되지 않아요.

ISO 호환성에 많은 노력이 투자되었어요. 실제로 GNU Prolog는 Prolog의 ISO 표준 [6]에 매우 근접해요. GNU Prolog는 또한 실제로 매우 유용한 다양한 확장 기능(전역 변수, OS 인터페이스, 소켓 등)을 제공해요. 특히 GNU Prolog에는 유한 도메인(FD)에 대한 효율적인 제약 솔버가 포함되어 있어요. 이를 통해 사용자는 제약 프로그래밍의 힘과 논리 프로그래밍의 선언성을 결합한 제약 논리 프로그래밍을 사용할 수 있어요.

GNU Prolog 솔버의 핵심 특징은 모든 (고수준) FD 제약을 정의할 때 하나의 (저수준) 기본 요소(primitive)를 사용한다는 점이에요. 이 접근 방식에는 많은 장점이 있어요:

  • 제약을 컴파일할 수 있어요.
  • 사용자가 (기본 요소를 기반으로) 자신만의 제약을 정의할 수 있어요.
  • 솔버가 열려 있고 확장 가능해요(CHIP 같은 블랙박스 솔버와는 대조적).
  • 게다가 GNU Prolog 솔버는 상용 솔버보다 종종 더 빠르고 효율적이에요.

GNU Prolog는 두 시스템에서 영감을 받았어요:

  • wamcc - Prolog를 C로 컴파일하는 컴파일러 [3]. wamcc의 핵심은 WAM을 거쳐 Prolog를 C로 번역하는 독창적인 컴파일 방식을 사용해 스탠드얼론 실행 파일을 만드는 능력이었어요. 단점은 gcc가 생성된 소스를 컴파일하는 데 걸리는 시간이었어요. GNU Prolog도 스탠드얼론 실행 파일을 만들 수 있지만 더 빠른 컴파일 방식을 사용해요.
  • clp(FD) - FD에 대한 제약 프로그래밍 언어 [4]. 핵심 특징은 FD 제약을 정의하는 데 하나의 기본 요소를 사용한 것이었어요. GNU Prolog는 같은 아이디어를 기반으로 하지만 확장된 제약 정의 언어를 제공해요. clp(FD)에 비해 GNU Prolog는 새로 미리 정의된 제약, 새로 미리 정의된 휴리스틱, 반영(reified) 제약 등을 제공해요.

다음은 GNU Prolog의 몇 가지 특징이에요:

Prolog 시스템:

  • Prolog의 ISO 표준(부동소수점 수, 스트림, 동적 코드 등)을 준수.
  • 많은 확장: 전역 변수, 정관절 문법(DCG), 소켓 인터페이스, 운영체제 인터페이스 등.
  • 300개가 넘는 Prolog 내장 술어.
  • Prolog 디버거와 저수준 WAM 디버거.
  • 원자(atom) 완성 기능이 있는 대화형 인터프리터의 라인 편집 기능.
  • Prolog와 C 사이의 강력한 양방향 인터페이스.

컴파일러:

  • 스탠드얼론 실행 파일을 만드는 네이티브 코드 컴파일러.
  • Prolog 파일, C 파일, WAM 파일 등 다양한 파일을 받아들이는 간단한 명령행 컴파일러.
  • wamcc + gcc보다 15배 빠른 어셈블리 코드 직접 생성.
  • 사용하지 않는 내장 술어 대부분은 링크하지 않음(실행 파일 크기를 줄이기 위해).
  • 컴파일된 술어(네이티브 코드)는 평균적으로 wamcc만큼 빠름.
  • 조회된(consult) 술어(바이트 코드)는 wamcc보다 5배 빠름.

제약 솔버:

  • FD 변수가 Prolog 환경에 잘 통합됨(Prolog 변수·정수와 완전 호환). 명시적인 FD 선언이 필요 없음.
  • 매우 효율적인 FD 솔버(상용 솔버에 필적).
  • 고수준 제약을 간단한 기본 요소로 기술할 수 있음.
  • 많은 미리 정의된 제약: 산술 제약, 부울 제약, 상징적 제약, 반영 제약 등.
  • 여러 미리 정의된 열거 휴리스틱.
  • 사용자가 자신만의 새 제약을 정의할 수 있음.
  • 50개가 넘는 FD 내장 제약/술어.

더 알아보기