프롤로그 (프로그래밍 언어)
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
프롤로그(Prolog)는 1972년 알랭 콜메로에르와 필리프 루셀에 의해 개발된 논리 프로그래밍 언어이다. 일계 술어 논리에 기반하며, 데이터 간의 관계를 나타내는 명제를 사용하여 프로그램을 구성한다. 쿼리를 통해 프로그램 로직을 실행하며, 단일화, 백트래킹, 비결정성, 양방향성 등의 특징을 가진다. 퀵 정렬, 하노이의 탑, 미분, 적분 등 다양한 문제를 해결하는 데 사용되며, 튜링 완전성을 갖는다. 모듈, 타입 시스템, 제약 논리 프로그래밍, 객체 지향 프로그래밍 등 다양한 확장을 지원하며, 다른 프로그래밍 언어와의 인터페이스도 제공한다. 현재는 교육 및 연구 분야에서 꾸준히 사용되고 있으며, 전문가 시스템, 자연어 처리, 웹 프로그래밍 등 다양한 분야에서 활용될 가능성을 보여주고 있다.
더 읽어볼만한 페이지
- 논리형 프로그래밍 언어 - 앨리스 (프로그래밍 언어)
앨리스는 Standard ML을 확장하여 동시성 및 지연 평가 기능을 제공하는 프로그래밍 언어이며, 미래와 약속 개념을 통해 동시성 프로그래밍을 지원하고 원격 프로시저 호출을 통해 다른 컴퓨터에서 계산을 수행할 수 있다. - 논리형 프로그래밍 언어 - 오즈 (프로그래밍 언어)
오즈는 게르트 스몰카가 설계한 다중 패러다임 프로그래밍 언어로서, 논리형, 함수형, 명령형, 객체 지향, 제약, 분산, 동시 프로그래밍을 지원하며 간단한 형식 의미론과 효율적인 구현을 목표로 한다. - 1972년 컴퓨팅 - 레드-블랙 트리
레드-블랙 트리는 각 노드가 색상 속성을 가지는 이진 탐색 트리로, 삽입, 삭제, 검색 연산에서 일정한 실행 시간을 보장하며 트리의 균형을 유지하고 효율적인 탐색 성능을 제공하는 특징을 가진다. - 1972년 컴퓨팅 - SAP SE
SAP SE는 독일의 다국적 소프트웨어 기업으로, 전사적 자원 관리(ERP) 소프트웨어를 주력으로 다양한 소프트웨어 제품 및 서비스를 제공하며, 클라우드 기반 기술로의 전환과 사업 확장, 그리고 사회적 책임 관련 논란이 있다. - 1972년 개발된 프로그래밍 언어 - C (프로그래밍 언어)
C는 하드웨어 제어와 이식성이 뛰어난 고급 절차적 프로그래밍 언어로서, 다양한 분야에서 사용되며 후속 언어에 영향을 주었고, 성능과 효율성이 높지만 안전성 문제 개선이 필요한 언어이다. - 1972년 개발된 프로그래밍 언어 - 스몰토크
스몰토크는 1970년대 제록스 PARC에서 개발된 객체 지향 프로그래밍 언어이며, GUI, 마우스 기술 개발에 기여하고 루비, 자바 등 다양한 언어에 영향을 미쳤으며, 메시지 전달 방식, 동적 타이핑, 이미지 기반 등의 특징을 가진다.
프롤로그 (프로그래밍 언어) - [IT 관련 정보]에 관한 문서 | |
---|---|
기본 정보 | |
![]() | |
개요 | |
패러다임 | 논리형 |
등장 시기 | 1972년 |
설계자 | 알랭 콜메라우어 외 |
자료형 | 비정형 (단일 자료형은 "텀(term)") |
유형 체계 | 동적 타이핑 |
영향 받은 언어 | Planner |
영향을 준 언어 | CHR 클로저 데이터로그 얼랭 Epilog KL0 KL1 Logtalk 머큐리 오즈 Strand Visual Prolog |
개발 | |
최신 버전 | 파트 1: 일반 코어 - 에디션 1 (1995년 6월) 파트 2: 모듈 - 에디션 1 (2000년 6월) |
구현체 | Amzi! Prolog B-Prolog Ciao ECLiPSe GNU Prolog LPA Prolog Poplog P# Quintus Prolog Scryer Prolog SICStus Strawberry Prolog SWI-Prolog Tau Prolog tuProlog WIN-PROLOG XSB YAP |
방언 | ISO Prolog 에든버러 프롤로그 |
기타 | |
파일 확장자 | .pl .pro .P |
웹사이트 | 파트 1: ISO 표준 파트 2: ISO 표준 |
2. 역사
프롤로그(Prolog)는 1972년경 알랭 콜메로에르가 로버트 코왈스키의 혼 절에 대한 절차적 해석을 기반으로 필리프 루셀과 함께 만들었으며, ''Prolog''라는 이름은 필리프 루셀이 그의 아내의 제안에 따라 ''programmation en logique|프로그라마시옹 앙 로지크프랑스어'' (''논리 프로그래밍''이라는 뜻)의 약어로 선택되었다.[79]
최초의 Prolog 시스템은 1972년 콜메로에르와 필리프 루셀에 의해 개발되었다.[80][81][82] Prolog의 첫 번째 구현은 제라르 바타니와 앙리 멜로니가 포트란으로 작성한 인터프리터였다. 데이비드 H. D. 워렌은 이 인터프리터를 에든버러 대학교로 가져갔고, 그곳에서 현대 구현에서 사용되는 "에든버러 Prolog" 구문을 정의하게 된 대체 프런트엔드를 구현했다. 워렌은 또한 Prolog의 첫 번째 컴파일러를 구현하여 페르난도 페레이라와 협력하여 영향력 있는 DEC-10 Prolog를 만들었다.
유럽 AI 연구원들은 Prolog를 선호하는 반면, 미국인들은 Lisp를 선호하여, 두 언어의 장점을 놓고 많은 논쟁을 벌였다.[83]
로버트 코왈스키와 데이비드 H. D. 워렌[91]은 DECsystem10 상에 마르세유 대학교와는 다른 구문을 가진 처리계를 만들었는데, 이것이 바로 DEC-10 Prolog이다. ISO 표준 규격을 포함한 오늘날 동작하는 Prolog 처리계는 대부분 이 계통의 구문을 따르고 있다. 코왈스키의 활동과 DEC-10 Prolog의 존재로 인해 영국은 Prolog 연구의 중심지가 되었다. 에든버러 대학교의 W. F. 클락신[92]과 C. S. 메리쉬[93]가 저술한 『Programming in Prolog영어』은 오랫동안 Prolog의 바이블로 사용되었다. 데이비드 워렌은 1983년 Prolog의 가상 머신 코드인 워렌 추상 머신(WAM)을 발표했다. 이후의 Prolog 처리계 구현은 C 언어 등으로 이 가상 머신 코드를 구현하고, 그 위에 Prolog 소스 코드를 이 머신 코드로 변환하는 컴파일러를 작성함으로써 개발을 간소화하고 구현상의 표준화를 도모하는 것이 일반화되었다.
1970년대 말, 일본에서는 통상성 전자 기술 종합 연구소의 후치 카즈히로를 중심으로 하는 그룹이 논리 프로그래밍의 중요성을 인식하고, 일본 컴퓨터 기술의 기초 기술로서 이것을 채택할 것을 제안한다. 이것이 1980년대의 신세대 컴퓨터 기술 개발 기구(ICOT)의 발족과 활동으로 이어졌다. 신세대 컴퓨터 기술 개발 기구(ICOT)는 총액 약 5700억엔의 국가 예산을 지원받아 1982년에 활동을 시작하였으며, Prolog를 포함한 논리형 언어는 이 연구의 핵심 언어로 채택되어 세계적인 주목을 받았다.
ICOT 활동 중인 1984년 교토 대학의 학생 3명[96]이 연구 과제로 제작한 Prolog-KABA는 그 성능과 어셈블러로 기술된 고속성으로 세계를 놀라게 했다. 이 처리계는 MS-DOS 상에서 제품화되어 Prolog의 보급에 크게 공헌했다.
1990년대에 들어서면서 제약 논리 프로그래밍이 주목받아 처리계가 다수 탄생했다. 이는 Prolog에서 인수의 논리 변수 간의 관계(제약)를 기술 가능하도록 확장한 것이다.
ISO 표준화 작업은 1987년경부터 작업 위원회(WG17[97])가 만들어졌고, 일본 위원도 정보 처리 학회에서 15명 정도가 참여했다. 1995년 ISO 표준 규격(ISO/IEC 13211-1 Prolog-Part 1: General Core)이 제정되었다.
1980년대 후반부터 1990년대 초반까지, 일본에서 ICOT 활동 시기를 포함한 인공지능 붐과 함께 Prolog는 주목받았다.[86] LISP 머신을 이용한 의료 정보 전문가 시스템에서의 성과는, 인공지능 연구 결과 일부가 정보 처리에도 이용 가능할 것이라는 기대를 갖게 했다. 이러한 평가 속에서 Prolog는 인공지능의 어셈블리 언어와 같은 위치를 기대받았다.
ICOT 해산 후 수년이 지나면서 논리 프로그래밍과 Prolog는 일본에서 급격히 쇠퇴하게 되었다.
비록 전성기의 기세는 잃었지만, Prolog는 각 교육 기관에서 주로 논리학 교재로 계속 사용되어 왔고, 오늘날까지 수만 명이 Prolog 강좌를 수강하고 있다.
2. 1. 탄생 배경
''Prolog''라는 이름은 필리프 루셀이 그의 아내의 제안에 따라 ''programmation en logique|프로그라마시옹 앙 로지크프랑스어''(프로그래밍의 프랑스어, 즉 ''논리 프로그래밍'')의 약어로 선택되었다.[79] 1972년경 알랭 콜메로에르가 로버트 코왈스키의 혼 절에 대한 절차적 해석을 기반으로 필리프 루셀과 함께 만들었다.Prolog의 탄생 배경에는 정리 자동 증명 연구가 크게 관련되어 있다. 1930년 자크 에르브랑은 자동 정리 증명과 Prolog의 기반이 되는 수리 논리학상의 기본 정리인 에르브랑 정리를 발표했다. 에르브랑의 논문에는 Prolog에 필수적인 단일화 알고리즘도 이미 포함되어 있었다.[88]
1950년대 이후, 컴퓨터 상에서의 정리 증명 연구가 활발해져, 길모어 알고리즘(1960)이나 데이비스-퍼트남 알고리즘(1958, 1960), 프라비츠에 의한 정리 증명에의 단일화 알고리즘의 도입(1960) 등을 거쳐, 1965년 로빈슨에 의한 도출 원리와 1960년대 후반 라브랜드에 의한 모델 제거의 증명 절차의 성과로부터 하나의 결실기를 맞이했다.
최초의 Prolog 시스템은 1972년 알랭 콜메로에르와 필리프 루셀에 의해 개발되었다.[80][81][82] 로버트 코왈스키에 따르면, Prolog의 첫 번째 구현은 제라르 바타니와 앙리 멜로니가 포트란으로 작성한 인터프리터였다.
2. 2. 코왈스키와 DEC-10 Prolog
로버트 코왈스키와 데이비드 H. D. 워렌[91]은 DECsystem10 상에 마르세유 대학교와는 다른 구문을 가진 처리계를 만들었다. 이것은 후에 DEC-10 Prolog라고 불리게 되었는데, ISO 표준 규격을 포함한 오늘날 동작하는 Prolog 처리계는 대부분 이 계통의 구문을 따르고 있다.코왈스키의 활동과 DEC-10 Prolog의 존재로 인해 영국은 Prolog 연구의 중심지가 되었다. 데이비드 워렌은 1983년 Prolog의 가상 머신 코드인 워렌 추상 머신(WAM)을 발표했다. 이후의 Prolog 처리계 구현은 C 언어 등으로 이 가상 머신 코드를 구현하고, 그 위에 Prolog 소스 코드를 이 머신 코드로 변환하는 컴파일러를 작성함으로써 개발을 간소화하고 구현상의 표준화를 도모하는 것이 일반화되었다.
2. 3. 신세대 컴퓨터 기술 개발 기구(ICOT)와 Prolog
1970년대 말, 일본 통상성의 전자 기술 종합 연구소의 후치 가즈히로를 중심으로 하는 그룹은 논리 프로그래밍의 중요성을 인식하고, 이를 일본 컴퓨터 기술의 기초 기술로 채택할 것을 제안했다. 이는 1980년대 신세대 컴퓨터 기술 개발 기구(ICOT)의 설립과 활동으로 이어졌다. ICOT는 총액 약 5700억엔의 국가 예산을 지원받아 1982년에 활동을 시작했다. Prolog를 포함한 논리형 언어는 이 연구의 핵심 언어로 채택되어 세계적인 주목을 받았다. 약 10년간의 연구 활동 기간 동안 Prolog와 논리 프로그래밍 연구는 크게 심화되었다. 1980년부터 20년 동안 Prolog를 주제로 한 일본어 서적이 약 50권 발간되었다. ICOT 연구원들은 Prolog 보급에 힘썼고, 강습회, 튜토리얼, 워크숍을 연 1회 이상 개최했다. ICOT가 주최한 로직 프로그래밍 컨퍼런스는 1983~1985년경에 젊은 연구자들에게 큰 영향을 주었다.연구 활동 전반기에는 논리형 언어의 실용성을 입증하기 위해 'Prolog 머신'이 설계되어 미쓰비시 전기와 오키 전기에 의해 제작되었고, ICOT 외 대학 등 연구 기관에 배포되었다. 이 개인용 순차 추론 머신 PSI의 기계어 KL0는 단일화나 백트래킹 등 Prolog의 기본적인 특징을 완전히 갖추고 있었다. KL0를 기반으로 운영 체제 SIMPOS가 설계되었고, 이를 기술하기 위해 Prolog에 객체 지향 프로그래밍을 도입한 ESP[95]가 치카야마 타카시에 의해 설계되어 사용되었다. ESP는 다중 상속을 특징으로 하는 당시로서는 선구적인 객체 지향 언어였지만, 캡슐화 미비 등이 지적되어 현재는 많이 사용되지 않는다. 그러나 OS 기술을 통해 논리형 언어에 객체 지향 언어적 요소를 더함으로써 가독성이 높아지고 프로그램 관리가 쉬워지는 것이 확인되었다. 한편으로는 Prolog만으로 운영 체제를 완전히 기술해 볼 기회를 놓친 것도 사실이다. ESP는 PSI를 전제로 하지 않고 이용할 수 있도록 C 언어로 다시 작성한 CESP가 개발되었지만, 널리 보급되지는 못했다. Prolog의 ISO 표준 규격 모듈 사양으로 ESP 채택이 부결된 1995~1996년경 이후에는 거의 이용되지 않게 되었다.
Prolog는 ICOT에 의해 널리 알려진 언어라는 인상이 강하지만, 프로그래밍 언어 Prolog의 관점에서 ICOT의 영향은 제한적이었다. 후치 소장 등 ICOT의 주요 연구 테마는 병렬 논리형 언어에 있었고, 연구 후반에는 Prolog 자체에서 멀어지게 되었다. PSI에 사용한 전자 기판을 이용하여 병렬 추론 머신 PIM이 제작되었고, Guarded Horn Clauses(GHC)에 기반한 병렬 연산 처리를 추가한 KL1이 설계되었다. KL1은 지식 프로그래밍 전반의 연구에 이용되었다. PSI와 SIMPOS를 사용한 연구도 계속되었지만, 할당된 연구원의 수는 매우 적었다.
ICOT의 활동을 총괄하여 지식 프로그래밍 각 과제에서 준비 부족으로 인한 미흡함을 지적하는 시각이 강하지만, Prolog 관점에서 전반기 활동은 오늘날 잘 언급되지는 않지만 매우 충실했다고 할 수 있다.
ICOT 활동 성기인 1984년 교토 대학 학생 3명[96]이 연구 과제로 제작한 Prolog-KABA는 그 성능과 어셈블러로 기술된 고속성으로 세계를 놀라게 했다. 이 처리계는 MS-DOS 상에서 제품화되어 Prolog 보급에 크게 공헌했다. 꼬리 재귀 최적화 등 높은 안정된 성능으로 여명기 PC 상의 비즈니스 소프트웨어 기초 언어로서의 전개도 기대되었지만, 16비트 정수만 사용하고 부동 소수점수를 다룰 수 없는 사양이었기 때문에 이 분야로의 전개는 이루어지지 않았다. 이는 어셈블러로 기술되어 확장이 쉽지 않은 점이 문제였다. 결과적으로 이러한 사양 부족은 일본 비즈니스 소프트웨어가 지식 프로그래밍 수준과의 사이에 놓인 분수령을 넘을 수 없었던 원인 중 하나가 되었다.
2. 4. 1990년대와 ISO 표준 규격
1990년대에 들어서면서 제약 논리 프로그래밍이 주목받아 여러 처리계가 등장했다. 이는 Prolog영어에서 인수의 논리 변수 간의 관계(제약)를 기술할 수 있도록 확장한 것이다. 제약 논리형 언어는 변수 평가에 지연 실행 등을 도입해야 하지만, 연립 방정식 등 많은 과제에서 Prolog영어보다 유연하게 기술할 수 있다.[97]1987년경부터 ISO의 표준화 작업 위원회(WG17)가 만들어졌고, 일본에서도 정보 처리 학회에서 15명 정도가 위원으로 참여했다. 1995년 ISO 표준 규격(ISO/IEC 13211-1 Prolog-Part 1: General Core)이 제정되었다. 2000년에는 ISO/IEC 13211-2 Prolog-Part 2: Module로 모듈 사양이 추가되었다.
ISO 표준 규격은 에든버러 사양 DEC-10Prolog영어을 기반으로 Quintus Prolog영어 등 주요 벤더와 유럽 학자들이 주축이 되고, 일본 등의 위원이 참여하여 작성되었다. 이 규격은 현재 Prolog 처리계 제작자에게 지침을 제공하고 있지만, 내장 술어의 개별 사양에서는 벤더의 의향이 강하게 반영되었고, 전체적으로는 논리학적 입장을 존중하여 보수적이고 작은 사양이 되었다.
JIS 규격은 2001년에 JIS X 3013:2001 "프로그램 언어 Prolog - 제1부: 기본부"가 발행되었지만, 2012년 1월에 폐지되었다.
2. 5. 인공지능 붐과 Prolog
1980년대 후반부터 1990년대 초반까지, 일본에서 ICOT 활동 시기를 포함한 인공지능 붐과 함께 Prolog는 주목받았다.[86] LISP 머신을 이용한 의료 정보 전문가 시스템에서의 성과는 인공지능 연구 결과 일부가 정보 처리에도 이용 가능할 것이라는 기대를 갖게 했다. 이러한 평가 속에서 Prolog는 인공지능의 어셈블리 언어와 같은 위치를 기대받았으며, 전문가 시스템을 지원하는 지식 엔지니어 양성을 위한 교육의 중심에 있었다.Prolog는 전문가 시스템에서 다용되는 프로덕션 시스템의 규칙을 자연스럽게 동적으로 변경할 수 있는 능력과, 뒤향 추론이라고 불리는 추론이 Prolog의 도출 과정 그 자체이기 때문에 전문가 시스템의 주요 기술 언어로 사용되었다. 그러나 전문가 시스템은 비즈니스 분야에서 광범위하게 응용될 수 있는 기초 기술이었지만, 저수준 분야로의 적용은 거의 시도되지 않았고, 이 분야에서 Prolog 언어에 대한 요구는 거의 없었다.
기계 번역 등의 자연어 처리 역시 인공지능의 한 축을 담당하는 분야였지만, 좌재귀 문제와 구조 문법 적용 시 방대한 사전 정의의 필요성으로 인해 Prolog는 점차 최전선에서 후퇴하게 되었다. 통계적 언어 처리 접근 방식에서는 단일화 등에 많은 계산량을 소비하는 Prolog가 대량 데이터를 다루는 데 적합하지 않아, 이용되는 경우가 거의 없었다. 자연어 처리 텍스트의 많은 부분이 Prolog를 사용하여 해설되고 있음에도 불구하고, 기대가 컸던 것에 비해 실무적으로는 겉으로 드러난 성과는 IBM사의 왓슨 정도에 그치고, 자연어 처리는 오히려 Prolog 평가의 발목을 잡는 경향마저 있다.
2. 6. ICOT 이후 일본에서의 쇠퇴
ICOT 해산 후 수년이 지나면서 일본에서 논리 프로그래밍과 Prolog는 급격히 쇠퇴했다. 로버트 코왈스키의 성과가 너무나 완성되어 그 연구 성과의 범위를 넘어서는 것이 어려웠고, 역사적으로 프로그래밍 언어이면서 논리학으로부터의 일탈을 엄격히 제한받아 자유로운 아이디어에 의한 프로그래밍 언어로서의 발전·전개가 어렵게 보였던 점도 연구자와 기술자를 떠나게 했다. 그리고 인공지능 붐도 또한 사라져 갔다.기업 등에서 계속된 연구 개발도 발표될 기회가 Prolog 산업 응용 심포지엄(INAP) 등에 한정되어, 사람들의 눈에 Prolog의 성과가 닿는 기회는 극단적으로 적어졌다. ICOT의 막대한 연구 성과가 인터넷상에서 열람 가능한 상태로 놓였지만, Prolog 언어의 처리계는 인터넷 시대의 기술·흐름을 타지 못했고, 초보자나 초학자가 이용하기 위한 인터넷상의 정보도 다른 유력 언어에 비해 적어 새로운 이용자를 끌어들일 수 없었다.
PC의 운영 체제로 마이크로소프트 윈도(Microsoft Windows)가 일반에 보급되기 시작하면서, 초보자 교육에 윈도 부품의 전개를 소재로 하는 데 적합한 객체 지향 언어에 인기가 집중되었고, Prolog는 동작이 느린 외면받는 언어라는 이미지를 갖게 되었다. 또한 21세기에 들어서면서 Prolog가 클래스 개념을 갖지 않기 때문에, 마이크로소프트사에 의한 .NET 아키텍처의 공용 언어 인프라(CLR)의 대상 언어에서 제외되어 이러한 경향에 박차를 가했다. 결국에는 낡은 언어라는 뉘앙스를 포함하여 "화석 언어"라고 조롱받기에 이르렀다.[79]
2. 7. 현재와 미래
Prolog영어는 교육 기관에서 논리학 교재로 주로 사용되어 왔으며, 현재까지 수만 명이 Prolog영어 강좌를 수강했다.[98] 실무적으로 사용될 기회가 적음에도 불구하고, Prolog영어에 대한 소양을 가진 사람이 많다는 점은 이 프로그래밍 언어가 가진 특이한 점이다. 또한, 많은 프로그래밍 언어에서 Prolog 인터프리터를 제작하는 것이 난이도 높은 학습 과제로 채택되어, Prolog를 이해하는 프로그래머가 늘어나는 추세이다.- 2011년, 브루스 A. 테이트[98]의 저서 『7개의 언어 7개의 세계』에서 Prolog영어가 7개의 언어 중 하나로 소개되면서 많은 사람들의 관심을 받게 되었고, Prolog영어는 다시 주목받기 시작했다. 다니엘 잭슨[99]의 저서 『추상에 의한 소프트웨어 설계』가 번역되면서 술어 논리에 기초한 형식 기술 언어 alloy영어가 주목받는 등, Prolog영어와 관련된 영역에서의 논의가 활발해졌다.
- 2012년, 이반 브라트코[100]의 저서 "Prolog Programming for Artificial Intelligence" 제4판이 11년 만에 간행되어 Prolog영어가 여전히 활발하게 연구되고 있음을 보여주었다. 또한, 애플리케이션 자동 생성 도구 GeneXus영어가 Prolog영어로 작성된 후 다른 사용 언어로 변환되어 제품화되었고, IBM 왓슨의 언어 분석 및 질문 생성 부분을 Prolog영어가 담당하고 있다는 점이 알려지면서, 응용 면에서도 현역 언어임이 재인식되었다. 더불어, 함수형 언어에 대한 관심이 높아지면서 함수형 언어와 유사성이 높은 논리형 언어인 Prolog영어 (인기 함수형 언어 Erlang영어의 원형)에 대한 관심도 다시 커졌다.
- 2013년 IBM은 왓슨 상용화를 추진하며 연구 개발 인력을 2000명으로 늘렸다. 2014년 가을, 소프트뱅크와 왓슨 일본어화에 대한 제휴를 발표했다. 소프트뱅크는 ADSL 고장 진단을 Prolog로 개발하여 사용해 왔고, 2015년 봄 출시 예정인 감정 인식 개인 로봇 Pepper의 핵심 부분에도 Prolog를 채용할 것으로 예상된다. 소프트뱅크와 왓슨의 협력으로 Pepper가 왓슨의 정보를 받아 어떻게 발전할 것인지, 그리고 두 시스템에서 Prolog가 어떤 역할을 담당할 것인지가 주목받고 있다.
- 2021년 8월 4일, "TIOBE Index for August 2021"에서 Prolog영어가 19위에 랭크되었다. 이는 2003년 이후 처음으로 20위권 내에 복귀한 것으로, 세계적으로 화제성을 되찾고 있다는 증거이다.
- 2016년, FLOPS에서 안기영과 안드레아 베초시의 논문 "다형 타입 시스템의 실행 가능한 관계 명세서"에서 프롤로그를 사용한 Let 다형 타입 추론기가 발표되었다. 최근 타입 이론에 일계 술어 논리가 사용되고 있으며, 타입 시스템 구현 실험에서 간략하게 기술할 수 있어 앞으로 활용될 가능성이 있다.
- 프롤로그 기반의 집합론적 타입 시스템이 실용화된다면, 함수형 언어 학회에서 사용되어 온 수식을 보다 형식적으로 만들 수 있을지도 모른다.
3. 구문 및 의미
프롤로그에서 프로그램 로직은 관계를 사용하여 표현되며, 계산은 이러한 관계에 대한 ''쿼리''를 실행하여 시작된다. 관계와 쿼리는 프롤로그의 단일 데이터 유형인 ''항''을 사용하여 구성된다.[12] 관계는 ''절''로 정의된다. 쿼리가 주어지면 프롤로그 엔진은 부정된 쿼리에 대한 해결 반박을 찾으려고 시도한다. 부정된 쿼리를 반박할 수 있다면, 발견된 인스턴스화가 적용된 원래 쿼리가 프로그램의 논리적 결과가 된다.
프롤로그는 술어의 진리값을 확인하는 과정에서 화면에 값을 인쇄하는 것과 같은 부작용을 발생시킬 수 있다. 따라서 프로그래머는 논리적 패러다임이 불편할 때 명령형 프로그래밍을 일부 사용할 수 있다. 프롤로그는 "순수 프롤로그"라는 순수 논리적 하위 집합뿐만 아니라 여러 비논리적 기능을 가지고 있다.
프롤로그에서 코드를 불러오는 것을 ''컨설팅''이라고 한다. 프롤로그는 `?-` 프롬프트에서 쿼리를 입력하여 대화식으로 사용할 수 있다. 해가 없으면 `no`를 출력하고, 해가 존재하면 해당 해를 출력한다. 쿼리에 여러 해가 있으면 세미콜론(;)을 입력하여 다른 해를 요청할 수 있다.[16]
Prolog영어 프로그램은 논리식으로 간주되며, 그 실행은 술어 논리에 의해 술어가 정의된 환경에서의 정리 증명으로 해석될 수 있다. 사용자는 논리 프로그래밍의 틀, 특히 술어 논리를 학습함으로써 이 언어의 기본적인 구조 대부분을 이해할 수 있다.
3. 1. 데이터형
프롤로그의 유일한 자료형은 ''항''이다. 항은 ''원자'', ''숫자'', ''변수'', ''복합 항''으로 구성된다.[13]- '''원자'''는 일반적인 문자열이다. 소문자로 시작하는 문자, 숫자, 밑줄(
_
)의 조합으로 나타내어지며, 일부 특수문자들의 조합 또한 원자가 되기도 한다. 작은따옴표(')로 둘러싸서 원자를 나타낼 수도 있다. 예를 들어x
,red
,'Taco'
,'some atom'
,'p(a)'
등이 있다. - '''숫자'''는 부동 소수점 또는 정수일 수 있다. 대부분의 주요 프롤로그 시스템은 임의 길이의 정수를 지원한다.
- '''변수'''는 대문자 또는 밑줄(_)로 시작하는 문자, 숫자, 밑줄의 조합으로 된 문자열이다. 변수는 임의의 항의 자리 표시자라는 점에서 논리의 변수와 밀접하게 유사하다.
- '''복합 항'''은 "술어"라고 하는 원자와 여러 개의 "인수"로 구성되며, 인수는 다시 항이다. 복합 항은 일반적으로 괄호 안에 쉼표로 구분된 인수 항 목록이 뒤따르는 술어로 작성된다. 인수의 수는 항의 아리티라고 한다. 원자는 아리티가 0인 복합 항으로 간주될 수 있다. 복합 항의 예는
person_friends(zelda,[tom,jim])
이다.
복합 항의 특수한 경우는 다음과 같다.
- '''리스트'''는 정렬된 항의 모음이다. 대괄호로 표시되며, 항은 쉼표로 구분되거나 빈 리스트의 경우
[]
로 표시된다. 예를 들어,[1,2,3,4]
또는[red,green,blue]
가 있다. 내부적으로는'.'/2
라는 텀을 재귀적으로 사용함으로써 표현된다. []
는 빈 리스트이다.''T''
가 리스트이고,''H''
가 리스트의 한 요소라고 하면,'.'(''H'', ''T'')
라는 텀은 리스트가 된다.''H''
는 머릿요소가 되고, 리스트의 나머지 부분 전체는 꼬리가 된다.[1,2,3]
이라는 리스트는'.'(1,'.'(2,'.'(3,[])))
이라는 텀과 동일하다.[''H''|''T'']
같이 써서 리스트 맨 앞의 머릿 요소와 나머지 부분 전체를 분리할 수 있다. 즉[1,2,3]
이[''H''|''T'']
에 매칭되면''H''
는1
,''T''
는[2,3]
이 된다.- '''문자열'''은 따옴표로 묶인 일련의 문자이다. 프롤로그 플래그
double_quotes
의 값에 따라 (숫자) 문자 코드의 리스트, 문자 리스트 (길이 1의 원자) 또는 원자와 동일하다. 예를 들어,"to be, or not to be"
와 같다.[14]
3. 2. 사실(Fact)
프롤로그는 사실(Fact)과 규칙(Rule)을 제공하여 데이터베이스를 구축하고, 이 데이터베이스에 질의를 통해 프로그램을 수행한다. 사실은 '참(true)'으로 정의되는 가장 기본적인 동작이다.사실은 헤드(head)와 인자(arguments)로 구성되는 서술식(predicate)으로 표현된다. 예를 들어 다음과 같다.
```prolog
cat(tom).
```
위 코드는 'tom'이 'cat'이라는 사실을 나타낸다. 여기서 'cat'은 헤드이고, 'tom'은 인자이다. 이 사실이 프롤로그 데이터베이스에 저장되면, 사용자는 다음과 같이 질의할 수 있다.
'tom'이 'cat'인지 질의:
```prolog
?- cat(tom).
yes.
```
무엇이 'cat'인지 질의:
```prolog
?- cat(X).
X = tom;
yes.
```
이처럼 프롤로그는 여러 사실들을 프로그램에 입력하여 데이터베이스를 구축할 수 있다. 세상의 지식을 프롤로그 서술식으로 표현하는 방법은 다양하다. 예를 들어, 'pat'과 'sally' 사이에 'father' 관계가 있을 때, 'pat'이 'sally'의 'father'임을 표현하는 방법은 두 가지가 있다.
```prolog
father(pat,sally).
father(sally,pat).
```
두 가지 모두 'father'가 헤드이고, 'pat'과 'sally'가 인자이다. 첫 번째는 관계-주어-목적어, 두 번째는 관계-목적어-주어로 표현한 것이다. 어떤 형태를 사용할지는 프로그래머가 선택하지만, 프로그램 내에서는 일관된 순서를 유지하는 것이 좋다.
몇몇 특수한 서술식은 내부적으로 미리 정의되어 입출력이나 운영체제와의 통신 같은 특수한 기능을 수행한다. 예를 들어, `write`는 화면에 문자열을 출력하는 데 사용된다.
```prolog
write('Hello').
```
위 식은 화면에 'Hello'를 출력한다.
본문이 비어있는 절을 '''팩트'''라고 한다. 팩트의 예는 다음과 같다.
```prolog
human(socrates).
```
이는 다음 규칙과 동일하다.
```prolog
human(socrates) :- true.
```
내장 술어 `true/0`는 항상 참이다.
위의 팩트가 주어지면 다음과 같이 질문할 수 있다.
''소크라테스는 인간인가?''
```prolog
?- human(socrates).
Yes.
```
''어떤 것들이 인간인가?''
```prolog
?- human(X).
X = socrates.
3. 3. 규칙(Rule)
프롤로그 프로그램에서 규칙(Rule)은 ":-" 기호를 사용하여 표현하며, 이는 "만약 ...하다면"을 의미한다.[88] 예를 들어 `light(on) :- switch(on).`는 "만약 switch가 on이면, light는 on이다"라는 의미이다.규칙에는 변수를 사용할 수 있다. 예를 들어 `father(X,Y) :- parent(X,Y),male(X).`는 "만약 X와 Y가 parent 관계이고, 동시에 X가 male이면, X와 Y는 father 관계이다"라는 의미이다.
AND 조건은 ","로, OR 조건은 ";"로 표현한다. 여러 규칙을 OR로 연결할 수 있다. 예를 들어,
```prolog
a :- b;c;d.
```
는 아래와 같다.
```prolog
a :- b.
a :- c.
a :- d.
```
하지만 다음과 같이 작성할 수는 없다.
```prolog
a;b :- c.
```
인터프리터에 질의를 입력하면, 인터프리터는 해당 질의에 맞는 사실을 찾는다. 직접적인 사실이 없으면, 해당 사실을 결론으로 갖는 규칙들을 재귀적으로 만족시키려 한다. 예를 들어,
```prolog
sibling(X,Y) :- parent(Z,X), parent(Z,Y).
father(X,Y) :- parent(X,Y), male(X).
mother(X,Y) :- parent(X,Y), female(X).
parent(trude, sally).
parent(tom, sally).
parent(tom, erica).
parent(mike, tom).
male(tom).
female(trude).
male(mike).
```
위와 같이 정의하고 `?- sibling(sally, erica)`라고 질의하면, 인터프리터는 `sibling/2` 규칙에서 X를 sally, Y를 erica와 매치시킨다. 그리고 `parent(Z, sally)`와 `parent(Z, erica)`를 동시에 만족시키기 위해 `parent(tom, sally)`에서 Z를 tom과 매치시키고, `parent(tom, erica)`를 확인하여 조건을 만족시킨다. 따라서 sally와 erica가 sibling 관계이므로 yes를 출력한다.
`male(X) :- father(X,_).`와 같이 작성하면, father 관계가 존재하기만 하면 father의 두 번째 인자와 상관없이 X가 male임을 의미한다.
Prolog 프로그램은 절(clause)을 통해 정의된 관계를 설명하며, 순수 Prolog는 혼 절로 제한된다. 규칙은 `Head :- Body.` 형태로, "Body가 참이면 Head도 참이다"라고 읽는다. 규칙의 본문은 목표라고 불리는 술어 호출로 구성된다. 내장된 논리 연산자 `,/2`는 목표의 논리곱을, `;/2`는 논리합을 나타낸다.
본문이 없는 절은 '''팩트'''라고 한다. 예를 들어, `human(socrates).`는 `human(socrates) :- true.`와 같다. 내장 술어 `true/0`는 항상 참이다.
위의 팩트가 주어지면, ''소크라테스는 인간인가?'' (`?- human(socrates).`)라고 질문하면 Yes를, ''어떤 것들이 인간인가?'' (`?- human(X).`)라고 질문하면 X = socrates를 출력한다.
본문이 있는 절을 '''규칙'''이라고 한다. 예를 들어 `mortal(X) :- human(X).`를 추가하고, ''어떤 것들이 죽는 존재인가?'' (`?- mortal(X).`)라고 질문하면 X = socrates를 출력한다.
Prolog의 프로그램은 일계 술어 논리에 기반하여 데이터 간의 관계를 나타내는 명제로 기술되며, 처리 시스템이 '''단일화'''(유니피케이션)라는 패턴 매칭을 적용하여 주어진 명제가 성립하는지 재귀적으로 탐색한다.[88]
3. 4. 계산
인터프리터에 질의를 입력하면, 프롤로그는 해당 질의에 맞는 사실을 찾거나 규칙을 만족시키기 위해 재귀적으로 노력한다. 예를 들어, 다음과 같이 정의된 사실과 규칙이 있다고 가정해 보자.```prolog
sibling(X,Y) :- parent(Z,X), parent(Z,Y).
father(X,Y) :- parent(X,Y), male(X).
mother(X,Y) :- parent(X,Y), female(X).
parent(trude, sally).
parent(tom, sally).
parent(tom, erica).
parent(mike, tom).
male(tom).
female(trude).
male(mike).
```
이때 "sally와 erica는 형제자매(sibling)인가?"라는 질의를 하면 ( `?- sibling(sally, erica)` ), 인터프리터는 `sibling/2` 규칙에서 X를 sally, Y를 erica와 매치시킨다. 그 후, `parent(Z, sally)`와 `parent(Z, erica)`를 동시에 만족하는 Z를 찾는다. `parent(tom, sally)`가 있으므로 Z는 tom과 매치되고, `parent(tom, erica)`도 존재하므로 주어진 조건을 모두 만족한다. 따라서 sally와 erica가 형제자매 관계임을 확인하고 'yes'를 출력한다.[12]
만약 주어진 질의를 증명하는 사실과 규칙 조합을 찾지 못하면 거짓이 된다. 이는 닫힌 세계 가정(Closed world assumption)이라고 불리는데, 프롤로그 데이터베이스에서 사실로 증명되지 않으면 거짓임을 의미한다.[12]
```prolog
legal(X) :- NOT illegal(X).
```
위와 같은 규칙에서 `legal(X)`는 가능한 모든 `illegal(X)`를 찾고, 만약 `illegal(X)`를 찾지 못하면 X는 `legal`이 된다. 이를 '실패에 의한 부정(Negation as failure)'이라고 한다.[12]
3. 5. 술어와 프로그램
술어는 머리의 이름과 아리티가 같은 절(clause)들의 모음이다. ''이름/아리티'' 표기법을 사용하여 술어를 지칭한다. 논리 프로그램은 술어들의 집합으로 구성된다.[13] 예를 들어, 다음 프롤로그 프로그램은 몇 가지 가족 관계를 정의하며, 네 개의 술어를 가지고 있다.```prolog
mother_child(trude, sally).
father_child(tom, sally).
father_child(tom, erica).
father_child(mike, tom).
sibling(X, Y) :- parent_child(Z, X), parent_child(Z, Y).
parent_child(X, Y) :- father_child(X, Y).
parent_child(X, Y) :- mother_child(X, Y).
```
`father_child/2` 술어는 세 개의 절을 가지며, 이들은 모두 팩트이고, `parent_child/2` 술어는 두 개의 절을 가지며, 둘 다 규칙이다.
내장 술어(built-in predicate)는 입출력, 그래픽 사용, 운영 체제와의 통신 등 특수한 기능을 수행한다.[14] 이러한 술어들은 관계적 의미를 부여받지 않으며, 시스템에 미치는 부작용에 대해서만 유용하다. 예를 들어, `write/1` 술어는 화면에 용어를 표시한다.
많은 내장 술어들의 관계적 특성 때문에, 일반적으로 여러 방향으로 사용될 수 있다. 예를 들어, `length/2`는 리스트의 길이를 결정하거나(리스트 `List`가 주어졌을 때 `length(List, L)`), 주어진 길이의 리스트 골격을 생성하는데(`length(X, 5)`) 사용될 수 있다. 마찬가지로, `append/3`는 두 개의 리스트를 연결하거나(리스트 `ListA`와 `ListB`가 주어졌을 때 `append(ListA, ListB, X)`) 하는데 사용될 수 있다.
3. 6. 루프와 재귀
반복 알고리즘은 재귀적 술어를 통해 구현될 수 있다.[15] 예를 들어, 다음 프롤로그 프로그램은 '조상' 관계를 정의한다.```prolog
ancestor(X, Y) :- parent_child(X, Y).
ancestor(X, Y) :- parent_child(X, Z), ancestor(Z, Y).
```
이는 X가 Y의 부모이거나 X가 Y의 조상의 부모인 경우 X가 Y의 조상임을 나타낸다. 이는 자기 자신을 사용하여 정의되기 때문에 재귀적이다(두 번째 절의 본문에 `ancestor/2` 술어 호출이 있다).
3. 7. 실행
프롤로그 프로그램의 실행은 사용자가 질의(query)를 입력함으로써 시작된다. 프롤로그 엔진은 SLD 해결이라는 방법을 사용하여 질의를 증명하려고 시도한다. 백트래킹을 통해 모든 가능한 해를 탐색한다.[12]인터프리터에 질의를 입력하면, 그 질의에 맞는 사실을 찾으려고 노력한다. 만약 직접적인 사실이 주어지지 않은 경우, 해당 사실을 결론으로 갖는 규칙들을 만족시키기 위해 재귀적으로 계속 노력한다. 예를 들어, 다음과 같이 정의된 가족 관계 프로그램에서
```prolog
?- sibling(sally, erica).
Yes
```
라는 질의는 참으로 평가된다.
이는 다음과 같이 얻어진다. 처음에, 질의 `sibling(sally, erica)`에 대한 일치하는 유일한 절 머리는 첫 번째 절이므로, 질의를 증명하는 것은 적절한 변수 바인딩이 적용된 해당 절의 본체를 증명하는 것과 같다. 즉, 결합 `(parent_child(Z,sally), parent_child(Z,erica))`이다. 증명해야 할 다음 목표는 이 결합의 가장 왼쪽에 있는 목표, 즉 `parent_child(Z, sally)`이다. 두 개의 절 머리가 이 목표와 일치한다. 시스템은 선택 지점을 생성하고 첫 번째 대안을 시도하며, 그 본체는 `father_child(Z, sally)`이다. 이 목표는 사실 `father_child(tom, sally)`를 사용하여 증명할 수 있으므로, 바인딩 `Z = tom`이 생성되고, 증명해야 할 다음 목표는 위의 결합의 두 번째 부분이다. 즉, `parent_child(tom, erica)`이다. 다시, 이것은 해당 사실에 의해 증명될 수 있다. 모든 목표를 증명할 수 있었으므로, 질의는 성공한다. 질의에 변수가 포함되지 않았으므로, 바인딩이 사용자에게 보고되지 않는다.
변수가 있는 질의는 다음과 같다.
```prolog
?- father_child(Father, Child).
```
이 질의는 백트래킹 시 모든 유효한 답을 열거한다.
프롤로그에서 코드를 불러오는 것은 ''컨설팅''이라고 한다. 프롤로그는 프롤로그 프롬프트 `?-`에서 쿼리를 입력하여 대화식으로 사용할 수 있다. 해가 없으면 프롤로그는 `no`를 출력한다. 해가 존재하면 해당 해가 출력된다. 쿼리에 여러 해가 있는 경우, 세미콜론 `;`을 입력하여 이를 요청할 수 있다.[16]
3. 8. 부정
`\+/1` 내장 프롤로그 술어는 실패에 의한 부정을 제공하며, 이를 통해 비단조 논리 추론이 가능하다.[12] `\+ illegal(X)`와 같은 목표는 다음과 같은 규칙으로 평가된다.프롤로그는 `illegal(X)`를 증명하려고 시도한다. 해당 목표에 대한 증명이 발견되면 원래 목표(즉, `\+ illegal(X)`)는 실패한다. 증명을 찾을 수 없으면 원래 목표가 성공한다. 따라서 `\+/1` 접두사 연산자는 "증명 불가능" 연산자라고 불린다. `?- \+ Goal.`과 같은 쿼리는 Goal을 증명할 수 없는 경우 성공하기 때문이다. 이러한 종류의 부정은 인수가 ground (즉, 변수를 포함하지 않음)인 경우 사운드하다. 인수에 변수가 포함되어 있고 증명 절차가 완료되면 사운드가 손실된다. 특히, `?- legal(X).` 쿼리를 사용하여 합법적인 모든 것을 열거할 수는 없다.[12]
4. 프로그래밍 예제
prolog
% 아래 예제는 ISO-PROLOG에 맞추어 작성된 것으로, 프롤로그 구현에 따라 문법이 조금씩 다를 수 있다.
% 퀵 정렬, 하노이의 탑 알고리즘, Computer Algebra 예제는 하위 섹션에서 자세히 다룬다.
4. 1. 퀵 정렬(Quicksort)
prologsplit(H, [A|X], [A|Y], Z) :-
order(A, H), split(H, X, Y, Z).
split(H, [A|X], Y, [A|Z]) :-
not(order(A, H)), split(H, X, Y, Z).
split(_, [], [], []).
quicksort([], X, X).
quicksort([H|T], S, X) :-
split(H, T, A, B),
quicksort(A, S, [H|Y]),
quicksort(B, Y, X).
```
퀵 정렬 알고리즘은 리스트를 정렬된 버전과 관련시킨다.
```prolog
partition([], _, [], []).
partition([X|Xs], Pivot, Smalls, Bigs) :-
( X @< Pivot ->
Smalls = [X|Rest],
partition(Xs, Pivot, Rest, Bigs)
; Bigs = [X|Rest],
partition(Xs, Pivot, Smalls, Rest)
).
quicksort([]) --> [].
quicksort([X|Xs]) -->
{ partition(Xs, X, Smaller, Bigger) },
quicksort(Smaller), [X], quicksort(Bigger).
4. 2. 하노이의 탑(Tower of Hanoi)
prologhanoi(N) :- move(N, left, center, right).
move(0, _, _, _) :- !.
move(N, A, B, C) :-
M is N-1,
move(M, A, C, B), inform(A, B), move(M, C, B, A).
inform(X, Y) :-
write([move, a, disc, from, the, X, pole, to, the, Y, pole]),
nl.
```
Prolog영어 프로그램은 하노이의 탑 문제를 해결하는 방법을 보여준다. 이 코드는 술어 논리를 기반으로 작성되었으며, 각 규칙은 문제 해결 단계를 나타낸다.[86]
4. 3. Computer Algebra
다음은 미분, 적분, 수식 정리를 정의하는 프롤로그 프로그램이다.미분을 정의하는 규칙은 다음과 같다.[86]
```prolog
d(X,X,1) :- !. /* d x dx = 1 */
d(C,X,0) :- atomic(C). /* d c dx = 0 */
d(-U,X,-A) :- d(U,X,A). /* d -u dx = - d u dx */
d(U+V,X,A+B) :- d(U,X,A), d(V,X,B). /* d u+v dx = d u dx + d v dx */
d(U-V,X,A-B) :- d(U,X,A), d(V,X,B). /* d u-v dx = d u dx - d v dx */
d(C*U,X,C*A) :- atomic(C), C \= X, d(U,X,A), !. /* d c*u dx = c*d u dx */
d(U*V,X,B*U+A*V) :- d(U,X,A), d(V,X,B). /* d u*v dx = u*d v dx + v*d u dx */
d(U/V,X,A) :- d(U*V^(-1),X,A). /* d u/v dx = d (u*v)^-1 dx */
d(U^C,X,C*U^(C-1)*W) :- atomic(C), C \= X, d(U,X,W). /* d u^c dx = c*u^(c-1)*d u dx */
d(log(U),X,A*U^(-1)) :- d(U,X,A). /* d ln(u) dx = u^-1 * d u dx */
```
적분을 정의하는 규칙은 다음과 같다.[86]
```prolog
i(0,X,0) :- !. /* Int 0 dx = 0 */
i(X,X,(X*X)/2) :- !. /* Int X dx = (X^2)/2 */
i(C,X,C*X) :- atomic(C). /* Int c dx = c*x */
i(-U,X,-A) :- i(U,X,A). /* Int -U dx = - Int U dx */
i(U+V,X,A+B) :- i(U,X,A), i(V,X,B). /* Int U+V dx = Int U dx + Int V dx */
i(U-V,X,A-B) :- i(U,X,A), i(V,X,B). /* Int U-V dx = Int U dx - Int V dx */
i(C*U,X,C*A) :- atomic(C), C \= X, i(U,X,A), !. /* Int cU dx = c (Int U dx) */
i(X^C,X,(X^(C+1))/(C+1)) :- atomic(C), !. /* Int x^c dx = x^(c+1)/(c+1) */
i(U,V,U*V-A) :- d(V,U,A), !. /* Int u dv = u*v - Int v du */
```
식을 정리하는 규칙은 다음과 같다.[86]
```prolog
s(+,X,0,X). /* x + 0 = x */
s(+,0,X,X). /* 0 + x = x */
s(+,X,Y,X+Y). /* x + y = x + y */
s(+,X,Y,Z) :- integer(X), integer(Y), Z is X+Y. /* x + y = z <- 값 계산 */
s(*,_,0,0). /* 모든 값 * 0 = 0 */
s(*,0,_,0). /* 0 * 모든 값 = 0 */
s(*,1,X,X). /* 1 * x = x */
s(*,X,1,X). /* x * 1 = x */
s(*,X,Y,X*Y). /* x * y = x * y */
s(*,X*Y,W,X*Z) :- integer(Y), integer(W), Z is Y*W.
s(*,X,Y,Z) :- integer(X), integer(Y), Z is X+Y. /* x * y = z <- 값 계산 */
5. 디자인 패턴
디자인 패턴은 소프트웨어 디자인에서 흔히 발생하는 문제에 대한 일반적이고 재사용 가능한 해결책이다. 프롤로그의 몇 가지 디자인 패턴으로는 스켈레톤, 기법,[17][18] 클리셰,[19] 프로그램 스키마,[20] 논리 설명 스키마,[21] 고차 프로그래밍이 있다.[22]
5. 1. 스켈레톤, 기법, 클리셰
디자인 패턴은 소프트웨어 디자인에서 흔히 발생하는 문제에 대한 일반적이고 재사용 가능한 해결책이다. 프롤로그의 몇 가지 디자인 패턴으로는 스켈레톤, 기법,[17][18] 클리셰,[19] 프로그램 스키마,[20] 논리 설명 스키마,[21] 및 고차 프로그래밍이 있다.[22]5. 2. 프로그램 스키마, 논리 설명 스키마
소프트웨어 디자인에서 자주 발생하는 문제에 대한 일반적이고 재사용 가능한 해결책인 디자인 패턴에는 프롤로그의 스켈레톤, 기법,[17][18] 클리셰,[19] 프로그램 스키마,[20] 논리 설명 스키마,[21] 고차 프로그래밍이 있다.[22]5. 3. 고차 프로그래밍
고차 술어는 하나 이상의 다른 술어를 인수로 사용하는 술어이다. 고차 프로그래밍은 술어에 대한 정량화를 허용하지 않는 일차 논리의 범위를 벗어나지만,[23] ISO 프롤로그는 `call/1`, `call/2`, `call/3`, `findall/3`, `setof/3`, `bagof/3`과 같은 내장 고차 술어를 제공한다.[31] 또한 임의의 프롤로그 목표를 런타임에 구성하고 평가할 수 있으므로, 주어진 목록의 각 멤버에 임의의 술어를 적용하는 `maplist/2`나 주어진 술어를 만족하는 요소를 필터링하여 커링을 허용하는 `sublist/3`과 같은 고차 술어를 쉽게 작성할 수 있다.[22]프롤로그는 시간 표현(백트래킹 시 답변 치환)에서 공간 표현(용어)으로 솔루션을 변환하기 위해, 주어진 쿼리의 모든 답변 치환을 목록으로 수집하는 다양한 모든 솔루션 술어를 가지고 있다. 이는 리스트 축약에 사용될 수 있다.
프롤로그의 고차 프로그래밍 스타일은 HiLog 및 λProlog에서 개척되었다.
6. 모듈
대규모 프로그래밍을 위해, 프롤로그는 ISO 표준에 있는 모듈 시스템을 제공한다.[24] 그러나 대부분의 프롤로그 시스템이 코드를 모듈로 구조화하는 것을 지원하지만, ISO 표준의 모듈 부분을 준수하는 구현은 거의 없다. 대신, 대부분의 프롤로그 시스템은 Quintus/SICStus 모듈 시스템을 ''사실상의'' 모듈 표준으로 지원하기로 결정했다. 그러나 모듈과 관련된 추가 편의 술어는 일부 구현에서만 제공되며 의미론에 미묘한 차이가 있는 경우가 많다.[25]
일부 시스템은 Logtalk의 경우와 같이 기본 ISO 프롤로그로의 소스 대 소스 컴파일로 모듈 개념을 구현하기로 선택했다.[26] GNU Prolog는 처음에는 ISO 모듈에서 벗어나, 유닛(모듈) 로딩 및 언로딩을 동적으로 수행할 수 있는 문맥적 논리 프로그래밍을 선택했다.[27] Ciao는 다른 프롤로그 시스템에서 사용되는 ''사실상의'' 표준과 기본적으로 호환되면서도, 정확한 정적 분석이 가능하고, 용어 숨김을 지원하며, 대규모 프로그래밍을 용이하게 하는 엄격한 모듈 시스템을 설계했다.[28] XSB는 다른 접근 방식을 취하여 ''원자 기반'' 모듈 시스템을 제공한다.[29] 후자의 두 프롤로그 시스템은 술어 외에도 ''용어의 가시성''을 제어할 수 있다.[25]
7. 메타 인터프리터와 리플렉션
프롤로그는 동형 언어이며, 반사 프로그래밍 (reflection)을 위한 많은 기능을 제공한다. 암묵적인 실행 전략 덕분에 순수 프롤로그 코드를 위한 간결한 메타 순환 평가자 (메타 인터프리터라고도 함)를 작성할 수 있다.
```prolog
solve(true).
solve((Subgoal1,Subgoal2)) :-
solve(Subgoal1),
solve(Subgoal2).
solve(Head) :-
clause(Head, Body),
solve(Body).
```
여기서 `true`는 빈 결합을 나타내며, `clause(Head, Body)`는 `Head :- Body` 형식의 데이터베이스 내의 절과 통합된다.
프롤로그 프로그램은 내장 메커니즘(`read/1`과 같은)을 사용하여 쉽게 읽고 검사할 수 있는 프롤로그 용어(`:-/2`는 중위 연산자)의 시퀀스이므로, 프롤로그에 도메인별 기능을 추가하는 맞춤형 인터프리터를 작성할 수 있다. 예를 들어, Sterling과 Shapiro는 불확실성을 가지고 추론을 수행하는 메타 인터프리터를 제시했으며, 약간의 수정을 거쳐 여기에 재현했다.[30]
```prolog
solve(true, 1) :- !.
solve((Subgoal1,Subgoal2), Certainty) :-
!,
solve(Subgoal1, Certainty1),
solve(Subgoal2, Certainty2),
Certainty is min(Certainty1, Certainty2).
solve(Goal, 1) :-
builtin(Goal), !,
Goal.
solve(Head, Certainty) :-
clause_cf(Head, Body, Certainty1),
solve(Body, Certainty2),
Certainty is Certainty1 * Certainty2.
```
이 인터프리터는 다음과 같은 형식의 내장 프롤로그 술어 테이블을 사용한다.[30]
```prolog
builtin(A is B).
builtin(read(X)).
% etc.
```
그리고 `clause_cf(Head, Body, Certainty)`로 표현되는 절을 사용한다. 이것들을 통해 `Goal`을 실행하고 결과에 대한 확실성 정도를 얻기 위해 `solve(Goal, Certainty)`로 호출할 수 있다.
8. 튜링 완전성
순수 프롤로그는 일차 술어 논리, 혼 클로스의 부분 집합을 기반으로 하며, 튜링 완전하다.[12] 프롤로그의 튜링 완전성은 튜링 기계를 시뮬레이션하는 데 사용하여 보여줄 수 있다. 다음은 튜링 머신을 시뮬레이션하는 프롤로그 프로그램의 예시다.
```prolog
turing(Tape0, Tape) :-
perform(q0, [], Ls, Tape0, Rs),
reverse(Ls, Ls1),
append(Ls1, Rs, Tape).
perform(qf, Ls, Ls, Rs, Rs) :- !.
perform(Q0, Ls0, Ls, Rs0, Rs) :-
symbol(Rs0, Sym, RsRest),
once(rule(Q0, Sym, Q1, NewSym, Action)),
action(Action, Ls0, Ls1, [NewSym|RsRest], Rs1),
perform(Q1, Ls1, Ls, Rs1, Rs).
symbol([], b, []).
symbol([Sym|Rs], Sym, Rs).
action(left, Ls0, Ls, Rs0, Rs) :- left(Ls0, Ls, Rs0, Rs).
action(stay, Ls, Ls, Rs, Rs).
action(right, Ls0, [Sym|Ls0], [Sym|Rs], Rs).
left([], [], Rs0, [b|Rs0]).
left([L|Ls], Ls, Rs, [L|Rs]).
```
다음은 간단한 튜링 기계의 예시이다.
```prolog
rule(q0, 1, q0, 1, right).
rule(q0, b, qf, 1, stay).
```
이 기계는 단항 인코딩으로 숫자에 1을 더하는 연산을 수행한다. 이는 "1" 셀을 반복하며 끝에 "1"을 추가한다. 예시 쿼리와 결과는 다음과 같다.
```prolog
?- turing([1,1,1], Ts).
Ts = [1, 1, 1, 1] ;
```
이는 모든 계산이 일련의 상태 변환으로 선언적으로 표현될 수 있으며, 프롤로그에서 관심 있는 연속적인 상태 간의 관계로 구현될 수 있음을 보여준다.
9. 구현
프롤로그는 효율성을 위해 일반적으로 워렌 추상 머신(WAM) 명령어 집합의 영향을 받는 추상 머신 코드로 컴파일된다.[38] 일부 구현에서는 컴파일 시간에 술어의 타입 및 모드 정보를 파생하기 위해 추상 해석을 사용하거나, 고성능을 위해 실제 머신 코드로 컴파일한다.[39] 프롤로그 코드의 효율적인 구현은 논리 프로그래밍 커뮤니티에서 활발히 연구되는 분야이며, 절 이진화 및 스택 기반 가상 머신 등 다양한 실행 방법이 사용되기도 한다.
1983년 데이비드 워렌이 발표한 워렌 추상 머신(WAM)은 프롤로그 처리계 구현의 표준화에 기여했다. 신세대 컴퓨터 기술 개발 기구의 프롤로그 머신 PSI는 1987~1988년경 개발된 PSI2부터 WAM 방식을 채택했으며, 이후 개발된 프롤로그 처리계의 대부분이 이 방식을 따랐다.
프롤로그 시스템은 꼬리 재귀 최적화 (TCO)를 구현하여 결정론적 꼬리 재귀 술어가 상수 스택 공간으로 실행되도록 한다. 항 색인은 서브선형 시간 조회를 가능하게 하는 자료 구조를 사용하여 프로그램 성능을 향상시킨다.[40] 대부분의 프롤로그는 첫 번째 용어에 대해서만 색인을 사용하지만, "필드 인코딩된 단어" 또는 "슈퍼임포즈 코드워드" 기반 기술은 전체 질의 및 헤드에서 빠른 색인을 제공한다.[41][42]
WIN-PROLOG 및 SWI-Prolog와 같은 일부 프롤로그 시스템은 해싱을 구현하여 대규모 데이터 집합을 효율적으로 처리한다. B-Prolog, XSB, SWI-Prolog, YAP, Ciao 등은 ''테이블링''이라는 메모이제이션 기법을 구현하여 중간 결과를 저장하고 재사용함으로써 실행 시간을 줄인다.[1]
제5세대 컴퓨터 시스템 프로젝트 기간 동안 하드웨어로 프롤로그를 구현하려는 시도가 있었으며,[46][47][48] 병렬 실행을 통한 속도 향상도 연구되었다.[49] 1982년 당시 컴퓨터는 초당 약 10,000 ~ 100,000 LIPS (논리 추론)으로 작동했지만, FGCS는 0.1 ~ 1 GLIPS로 작동하는 컴퓨터를 생산할 계획이었다.[51] 최근에는 제한된 프롤로그 프로그램을 필드 프로그래머블 게이트 어레이로 컴파일하는 접근 방식도 시도되었다.[50]
세가는 1986년 일본 시장에 출시된 세가 AI 컴퓨터에 프롤로그를 구현하여 일본어 자연어 입력을 처리하는 데 사용했다.[53]
9. 1. ISO Prolog
국제 표준화 기구(ISO) 프롤로그 기술 표준은 두 부분으로 구성되어 있다. 1995년에 발표된 ISO/IEC 13211-1은[31][32] 프롤로그 핵심 요소의 많은 구현에서 기존의 관행을 표준화하는 것을 목표로 한다. 이전에는 모호했던 언어의 측면을 명확히 했으며 이식 가능한 프로그램을 만들 수 있게 되었다. 세 가지 정오표 Cor.1:2007,[33] Cor.2:2012,[34] 그리고 Cor.3:2017[35]가 있다. 2000년에 발표된 ISO/IEC 13211-2는[31] 표준에 모듈에 대한 지원을 추가한다. 이 표준은 ISO/IEC JTC1/SC22/WG17[36] 실무 그룹에서 관리한다.1995년 ISO/IEC 13211-1 Prolog-Part 1: General Core로 ISO 표준 규격이 제정되었다. 2000년에는 ISO/IEC 13211-2 Prolog-Part 2: Module로 모듈 사양이 추가되어 규격화되었다.
9. 2. 컴파일
효율성을 위해 프롤로그 코드는 일반적으로 추상 머신 코드로 컴파일되며, 종종 레지스터 기반의 워렌 추상 머신(WAM) 명령어 집합의 영향을 받는다.[38] 일부 구현에서는 컴파일 시간에 술어의 타입 및 모드 정보를 파생하기 위해 추상 해석을 사용하거나, 고성능을 위해 실제 머신 코드로 컴파일한다.[39] 프롤로그 코드에 대한 효율적인 구현 방법을 고안하는 것은 논리 프로그래밍 커뮤니티에서 활발히 연구되는 분야이며, 일부 구현에서는 절 이진화 및 스택 기반 가상 머신을 포함한 다양한 다른 실행 방법이 사용된다.데이비드 워렌은 1983년 프롤로그의 가상 머신 코드인 워렌 추상 머신(WAM)을 발표했다. 이후 프롤로그 처리계 구현은 C 언어 등으로 이 가상 머신 코드를 구현하고, 그 위에 프롤로그 소스 코드를 이 머신 코드로 변환하는 컴파일러를 준비하는 절차를 거쳐 개발을 간소화하고 구현상의 표준화를 도모하는 것이 일반화되었다. 일본 신세대 컴퓨터 기술 개발 기구의 프롤로그 머신 PSI는 1987~1988년경 개발된 PSI2부터 이 방식을 채용했고, 이후 개발된 프롤로그 처리계의 대부분이 이 방식을 따랐다.
9. 3. 꼬리 재귀 최적화
프롤로그 시스템은 일반적으로 꼬리 재귀 또는 꼬리 호출을 보이는 결정론적 술어에 대해 꼬리 호출 최적화(TCO)라는 최적화 방법을 구현한다. 즉, 꼬리 위치에서 호출을 수행하기 전에 절의 스택 프레임을 삭제한다. 따라서 결정론적 꼬리 재귀 술어는 다른 언어의 루프처럼 상수 스택 공간으로 실행된다.9. 4. 항 색인
질의 내 용어와 통합 가능한 절을 찾는 것은 절의 수에 대해 선형적이다. 항 색인은 자료 구조를 사용하여 서브선형 시간 조회를 가능하게 한다.[40] 색인은 프로그램 성능에만 영향을 미치며, 의미론에는 영향을 미치지 않는다. 대부분의 프롤로그는 모든 용어에 대한 색인이 비용이 많이 들기 때문에 첫 번째 용어에 대해서만 색인을 사용하지만, "필드 인코딩된 단어" 또는 "슈퍼임포즈 코드워드"를 기반으로 하는 기술은 전체 질의 및 헤드에서 빠른 색인을 제공한다.[41][42]9. 5. 해싱
일부 프롤로그 시스템, 예를 들어 WIN-PROLOG 및 SWI-Prolog는 해싱을 구현하여 대규모 데이터 집합을 보다 효율적으로 처리한다. 이는 워드넷과 같은 대규모 코퍼스를 사용할 때 매우 큰 성능 향상을 가져오는 경향이 있다.9. 6. 테이블링
B-Prolog, XSB, SWI-Prolog, YAP, Ciao 등 일부 프롤로그 시스템은 ''테이블링''이라는 메모이제이션 기법을 구현하여 사용자가 중간 결과를 수동으로 저장할 필요가 없도록 한다. 테이블링은 시간-공간 트레이드오프의 일종으로, 중간 결과를 저장하기 위해 더 많은 메모리를 사용하여 실행 시간을 줄일 수 있다.[1]쿼리 평가에서 만난 하위 목표는 해당 하위 목표에 대한 답변과 함께 테이블에 유지된다. 하위 목표가 다시 나타나면 평가에서는 프로그램 절에 대한 재해결 대신 테이블의 정보를 재사용한다.[1]
테이블링은 다양한 방향으로 확장될 수 있다. '''SLG 해결''' 또는 선형 테이블링을 통해 재귀적 술어를 지원할 수 있다. 멀티 스레드 프롤로그 시스템에서 테이블링 결과는 스레드에 개인적으로 유지되거나 모든 스레드 간에 공유될 수 있으며, 점진적 테이블링에서는 변경 사항에 반응할 수 있다.[1]
9. 7. 하드웨어 구현
제5세대 컴퓨터 시스템 프로젝트 기간 동안, 전용 아키텍처를 통해 더 빠른 실행을 달성하기 위해 하드웨어로 프롤로그를 구현하려는 시도가 있었다.[46][47][48] 프롤로그는 병렬 실행을 통해 속도를 높일 수 있는 여러 속성을 가지고 있다.[49] 더 최근의 접근 방식은 제한된 프롤로그 프로그램을 필드 프로그래머블 게이트 어레이로 컴파일하는 것이다.[50] 그러나 범용 하드웨어의 빠른 발전은 지속적으로 더 특화된 아키텍처를 능가했다.1982년에 컴퓨터는 초당 약 10,000 ~ 100,000 LIPS (논리 추론)으로 작동했다. FGCS는 0.1 ~ 1 GLIPS로 작동하는 컴퓨터를 생산할 계획이었다.[51] 신세대 컴퓨터 기술 연구소 문서는 1 LIP이 기존 컴퓨터에서 약 100번의 연산을 수행하는 것으로 추정했다. 계획은 프로젝트 종료 시점(1992년)에 1 GLIPS를 달성하는 1000개의 프로세서를 갖춘 머신을 생산하는 것이었고, 이는 프로세서당 최소 1 MLIPS를 의미했다.[52]
세가는 1986년 일본 시장에 출시된 세가 AI 컴퓨터와 함께 사용할 프롤로그를 구현했다. 프롤로그는 일본어로 된 자연어 입력을 터치 패드를 통해 읽는 데 사용되었다.[53]
10. 한계
프롤로그는 연구 및 교육 분야에서 널리 사용되지만, 컴퓨터 산업에 큰 영향을 미치지 못했다.[55] 대부분의 프롤로그 애플리케이션은 규모가 작고, 코드 라인이 100,000 라인을 초과하는 경우는 드물다.[55][56] 모든 프롤로그 컴파일러가 모듈을 지원하지 않고, 주요 프롤로그 컴파일러 간의 모듈 시스템에 호환성 문제가 있어 대규모 프로그래밍은 복잡하다.[26]
프롤로그로 개발된 소프트웨어는 기존 프로그래밍 언어에 비해 성능이 떨어진다는 비판을 받는다.[58] 특히, 프롤로그의 비결정적 평가 전략은 결정적 계산을 프로그래밍하거나 "신경쓰지 않는 비결정성"(단일 선택을 하는 경우)을 사용할 때 문제가 될 수 있다. 원하는 성능을 얻기 위해 컷 연산자와 같은 구문을 사용해야 할 수 있는데, 이는 프로그램을 "앞뒤로" 실행하는 프롤로그의 주요 매력을 저해한다.[58]
프롤로그는 순수하게 선언적이지 않다. 컷 연산자와 같은 구문 때문에 프롤로그 프로그램을 이해하려면 절차적 해석이 필요하다.[59] 프롤로그 프로그램의 절 순서는 언어의 실행 전략이 이에 의존하기 때문에 중요하다.[60] 데이터로그와 같은 다른 논리 프로그래밍 언어는 진정으로 선언적이지만 언어를 제한한다. 그 결과, 많은 실용적인 프롤로그 프로그램은 순수하게 선언적인 논리 프로그램이 아닌 프롤로그의 깊이 우선 탐색 순서에 맞게 작성된다.[58]
11. 확장
프롤로그는 타입 시스템, 모드, 제약 논리 프로그래밍(CLP), 객체 지향 논리 프로그래밍(OOLP), 동시성, 선형 논리(LLP), 함수형 및 고차 논리 프로그래밍, 지식 베이스와의 상호 운용성 등 다양한 기능을 포함하도록 확장된 여러 구현체들이 개발되었다.[86]
프랑스의 알랭 콜메라워와 필립 루셀이 1972년경에 고안한 프롤로그는, 프로그램이 논리식으로 간주되고 그 실행은 술어 논리에 의해 정의된 환경에서의 정리 증명으로 해석되는 경우가 많다는 성립 배경을 가진다.
프롤로그는 기본적으로 술어 논리의 틀 안에서 설계되었기 때문에, 다른 프로그래밍 언어와 달리 학습해야 할 개념이나 용어가 술어 논리의 것만으로 충분하다. 그러나 SWI-Prolog 등의 처리계에서는 다양한 기능 확장이 시도되고 있다.
11. 1. 타입 시스템
프롤로그는 무형 언어이다. 1980년대에 프롤로그에 타입을 도입하고 확장하려는 시도가 시작되었으며,[61][62] 2008년까지 이어지고 있다.[63] 타입 정보는 타입 안정성뿐만 아니라 프롤로그 프로그램에 대한 추론에도 유용하다.[64]형 분류는 동적 타입 지정으로 분류될 수 있지만, 언어 사양 내에 타입 개념은 등장하지 않는다. 프롤로그의 단일화, 백트래킹, 논리 변수의 바인딩은 독특하며, 그 실행은 타입 추론의 실행 과정과 매우 유사하다. 프롤로그는 인수를 전달할 때 단일화라는 엄격한 패턴 매칭을 수행하는 데 많은 비용을 들였다. 단일화만으로 프로그램을 제어할 수 있는 언어가 프롤로그라고 해도 과언이 아니다. 이러한 단일화만으로 간단하고 강력한 프로그램 제어를 방해할 수 있는 타입 지정 강화는 프롤로그 언어와 그 지지자들에게 받아들여지지 않을 것이다.
2016년, FLOPS에서 안기영(Ki Yung Ahn)과 안드레아 베초시(Andrea Vezzosi)의 논문 "다형 타입 시스템의 실행 가능한 관계 명세서"에서 프롤로그를 사용한 Let 다형 타입 추론기가 발표되었다. 큰 화제가 되지는 않았지만, 최근 타입 이론에 일계 술어 논리가 사용되고 있으며, 타입 시스템의 구현 실험에서 극히 간략하게 기술할 수 있기 때문에, 앞으로 활용될 가능성이 있다.
프롤로그 기반의 집합론적 타입 시스템이 실용화된다면, 함수형 언어 학회에서 오래전부터 사용되어 온 수식을 보다 형식적으로 만들 수 있을지도 모른다.
11. 2. 모드
프롤로그 구문은 술어의 어떤 인수가 입력이고 어떤 인수가 출력인지 명시하지 않는다.[65] 그러나 이 정보는 중요하며 주석에 포함하는 것이 권장된다.[66] 모드는 프롤로그 프로그램을 추론할 때 유용한 정보를 제공하며,[64] 실행 속도를 높이는 데에도 사용될 수 있다.[67]모드 지정자 | 해석 |
---|---|
+ | 진입 시 nonvar |
- | 진입 시 var |
? | 지정되지 않음 |
11. 3. 제약 조건
제약 논리 프로그래밍은 제약 만족 문제의 개념을 포함하도록 프롤로그를 확장한다.[68][69] 제약 논리 프로그램은 절의 본문에 제약을 허용하며, 예를 들어A(X,Y) :- X+Y>0.
와 같다. 대규모 조합 최적화 문제에 적합하며[70], 자동 시간표 작성 및 생산 일정 관리와 같은 산업 환경에서의 응용에 유용하다. 대부분의 프롤로그 시스템은 유한 도메인에 대한 최소 하나의 제약 해결기를 제공하며, 종종 유리수와 같은 다른 도메인에 대한 해결기도 제공한다.1990년대에 들어서면서 제약 논리 프로그래밍이 주목받아 처리계가 다수 탄생했다. 이는 프롤로그에서 인수의 논리 변수 간의 관계(제약)를 기술 가능하도록 확장한 것이다. '''제약 논리형 언어'''는 변수 평가에 지연 실행 등을 도입할 필요가 있지만, 연립 방정식을 비롯한 많은 과제에서 프롤로그보다 유연하게 기술할 수 있다. 프롤로그의 내장 술어에는 인수가 변수로 전달되면 오류가 발생하는 것이 많아, 이 때문에 프롤로그 프로그래머는 변수가 구체화되도록 부목표의 기술 순서에 신경 쓸 필요가 있었다. 결과적으로 프로그래밍에 순차성이 생겼다. 제약 논리 프로그래밍에서는 나중에 변수가 구체화될 때 검사하기 위한 변수 간의 제약만 기술하면 이러한 순차성의 구속을 해결하고 통과할 수 있다. 사실 이 제약은 프롤로그에서 봐도 자연스러운 확장이며, 오히려 프롤로그의 단일화가 제약 논리 프로그래밍의 제약을 "
=
"만으로 제한한 것이라고 해석할 수 있다. 그러나, 간소하고 순차적인 성격을 강하게 가진 프롤로그의 처리계에 익숙한 사용자가, 제약 논리 프로그래밍의 술어 중에 다시 변수 제약의 선언을 추가해야 하는 부담을 받아들이고 있다고는 말하기 어렵다. 제약 논리 프로그램 처리계가 프롤로그의 것으로 대체될 기미는 2013년 11월 현재까지도 없다.11. 4. 객체 지향
로그톡은 대부분의 프롤로그 구현을 백엔드 컴파일러로 사용할 수 있는 객체 지향 논리 프로그래밍 언어이다. 다중 패러다임 언어로서 프로토타입과 클래스 모두를 지원한다. 비주얼 프롤로그는 인터페이스, 클래스, 구현 및 객체 표현식을 갖춘 다중 패러다임 언어이다.11. 5. 그래픽스
SWI-Prolog[71], 비주얼 프롤로그, 윈-프롤로그, B-프롤로그는 그래픽스 라이브러리를 제공하는 프롤로그 시스템이다.11. 6. 동시성
MPI를 통한 분산 컴퓨팅을 지원하는 오픈 소스 SWI-Prolog 확장으로 Prolog-MPI가 있다.[72] 이 외에도 다양한 동시성 프로그래밍 언어들이 개발되었다.[73]11. 7. 웹 프로그래밍
SWI-Prolog, Ciao 등 일부 프롤로그 구현체는 웹 프로토콜, HTML, XML을 지원하는 서버 측 웹 프로그래밍을 지원한다.[74] 또한 시맨틱 웹 형식, 예를 들어 자원 기술 프레임워크 (RDF) 및 웹 온톨로지 언어 (OWL)를 지원하는 확장 기능도 있다.[75][76] 프롤로그는 클라이언트 측 언어로도 제안되었다.[77] 비주얼 프롤로그는 JSON-RPC 및 웹소켓을 지원한다.11. 8. Adobe Flash
Cedar는 무료이며 기본적인 프롤로그 인터프리터이다. 버전 4 이상부터 Cedar는 FCA(Flash Cedar App)를 지원하며, ActionScript를 통해 프롤로그로 프로그래밍할 수 있는 새로운 플랫폼을 제공한다.11. 9. 기타 확장
F-로직은 프레임/객체를 사용하여 지식 표현을 위해 프롤로그를 확장한다.[1] 트랜잭션 로직은 상태 변경 업데이트 연산자에 대한 논리적 이론을 사용하여 프롤로그를 확장하며, 모델 이론적 의미론과 절차적 의미론을 모두 가지고 있다.[1] OW 프롤로그는 프롤로그의 그래픽 및 인터페이스 부족 문제를 해결하기 위해 만들어졌다.[1]12. 다른 언어와의 인터페이스
프롤로그는 다양한 프로그래밍 언어와 연결될 수 있는 인터페이스를 제공한다. 다음은 주요 인터페이스 목록이다.
- LPA Intelligence Server: C, C++, C#, 자바, Visual Basic (VB), 델파이, .NET, 루아, 파이썬 등과 연결 가능하다.[78] LPA 프롤로그의 전용 문자열 데이터 형식을 활용한다.
- Logic Server API: 프롤로그를 C, C++, 자바, Visual Basic (VB), 델파이, .NET에 확장 및 임베딩할 수 있다. .dll 또는 .so를 호출 가능한 모든 언어 및 환경에서 사용 가능하다.
- JPL: SWI-Prolog에 기본 제공되는 양방향 자바-프롤로그 브리지다. 자바와 프롤로그 간 상호 호출(재귀적 호출 포함)을 지원하며, 우수한 동시성 처리 능력을 갖춘 것으로 알려져 있다.
- InterProlog: 자바와 프롤로그 간 양방향 술어/메서드 호출을 구현하는 라이브러리 브리지다. 자바 객체와 프롤로그 용어 간 매핑을 지원하여, 논리 처리는 프롤로그 계층에, GUI 등은 자바에서 개발할 수 있게 한다. XSB 및 SWI-Prolog를 지원한다.
- Prova: 자바와의 네이티브 구문 통합, 에이전트 메시징, 반응 규칙을 제공하며, 명령형 프로그래밍과 선언형 프로그래밍을 결합한 미들웨어용 규칙 기반 스크립팅(RBS) 시스템으로 자리매김한다.
- PROL: 자바용 임베디드 프롤로그 엔진이다.
- GNU Prolog for Java: ISO 프롤로그를 자바 라이브러리로 구현한 것이다.
- Ciao: C, C++, 자바 및 관계형 데이터베이스 인터페이스를 제공한다.
- C#-Prolog: C#으로 작성된 프롤로그 인터프리터로, C# 프로그램에 쉽게 통합 가능하다.
- PHP용 Warren Abstract Machine: PHP 5.3용 프롤로그 컴파일러 및 인터프리터다.
- tuProlog: 분산 애플리케이션 및 인프라를 위한 경량 프롤로그 시스템이다. 다중 패러다임 프로그래밍을 지원하며, tuProlog 자바 버전은 프롤로그와 자바, tuProlog .NET 버전은 모든 .NET 기반 언어(C#, F# 등) 간 통합 모델을 제공한다.
- Janus: 프롤로그와 파이썬 간 양방향 인터페이스다.[78]
13. 관련 언어
- 괴델은 동시 제약 논리 프로그래밍의 강력한 형식의 구현체이며, SICStus Prolog를 기반으로 구축되었다.
- 비주얼 프롤로그는 이전에는 PDC 프롤로그 및 터보 프롤로그로 불렸으며, 표준 프롤로그와 매우 다른 데이터 유형의 강력한 형식의 객체 지향 프로그래밍 방언이다. 터보 프롤로그처럼 보란드에서 판매했지만, 현재는 이를 제작한 덴마크 회사인 프롤로그 개발 센터(PDC)에서 개발 및 판매하고 있다.
- 데이터로그는 프롤로그의 하위 집합으로, 계층화될 수 있는 관계에만 제한되며 복합 용어를 허용하지 않는다. 프롤로그와 달리 튜링 완전하지 않다.
- 머큐리는 정적이며 다형적인 타입 시스템과 모드 및 결정론 시스템을 갖춘 대규모 소프트웨어 엔지니어링을 위해 설계된 프롤로그의 파생 언어이다.
- GraphTalk는 추가적인 객체 지향 속성을 가진 Warren의 Abstract Machine의 독점적인 구현체이다.
- 어떤 면에서 프롤로그는 플래너의 하위 집합이다. 플래너의 아이디어는 나중에 과학 커뮤니티 비유에서 더 발전했다.
- 에이전트스피크는 다중 에이전트 시스템에서 에이전트 동작을 프로그래밍하기 위한 프롤로그의 변형이다.
- 에를랑은 프롤로그 기반 구현으로 시작되었으며, 프롤로그의 통합 기반 구문의 많은 부분을 유지하고 있다.
- [https://picolisp.com/wiki/?accessToLispFunctionFromPilog Pilog]는 피코리스프를 기반으로 구축된 선언적 언어이며, 프롤로그의 의미를 가지지만 리스프의 구문을 사용한다.
- λProlog는 λ-트리 구문 및 고차 패턴 통합을 통해 변수 바인딩 연산자를 갖는 용어를 직접 지원하는 것을 포함하여, 다형적 타이핑, 모듈식 프로그래밍 및 고차 프로그래밍을 특징으로 하는 핵심 프롤로그의 확장이다.
14. 처리계
Prolog영어 처리계는 다양하며, 각각 다른 특징을 가지고 있다. 다음은 현재 사용 가능한 주요 처리 시스템 목록이다.
처리 시스템 | 오픈 소스 | 유료/무료 | 준수 규격 | 비고 |
---|---|---|---|---|
[http://www.amzi.com/ Amzi!Prolog영어] | 유료 | ISO 규격 | ||
[http://www.az-prolog.com/ AZ-Prolog영어] | 개인/학술은 무료 | ISO/DEC-10 Prolog영어 | 일본어 지원, Prolog-KABA 호환(그래픽 제외) | |
[http://www.probp.com/ B-Prolog영어] | 학술은 무료 | |||
[http://www.clip.dia.fi.upm.es/Software/Ciao Ciaoit Prolog영어] | ○ | ISO 규격 | ||
[http://www.gprolog.org/ GNU Prolog영어] | ○ | ISO 규격 | ||
K-Prolog [101] | 유료 | ISO 규격 | 일본어 지원 | |
micro-Prolog영어 | 학술 연구용 [102], CP/M80에서 동작 | |||
[http://www.ifcomputer.co.jp/MINERVA MINERVA영어] | 유료 | ISO 규격 | 업무용, Java영어 기반 | |
[https://www.cs.tcd.ie/open-prolog/ Open Prolog영어] | 무료 | ISO 규격 | Mac OS영어용 | |
[http://kaminari.scitec.kobe-u.ac.jp/PrologCafe/ Prolog Cafe영어] | ○ | Prolog영어 프로그램을 Java영어 프로그램으로 변환 | ||
[http://prolog.hodroj.net/ Prolog.NET영어] | ○ | .NET영어에서 Prolog영어을 사용할 수 있음 | ||
[http://homepages.inf.ed.ac.uk/stg/research/Psharp/ P#영어] | Prolog영어 프로그램을 C# 프로그램으로 변환 | |||
[http://www.itee.uq.edu.au/~pjr/HomePages/QuPrologHome.html Qu-Prolog영어] | 멀티 스레드 처리 시스템 | |||
Rebol Prolog영어 | ||||
[http://www.sics.se/sicstus/ SICStus Prolog영어] | 유료 | ISO 규격 | 다수의 운영 체제 지원, Java영어 및 .NET영어에서 웹 애플리케이션 개발 가능. | |
[http://www.zogotounga.net/comp/squeak/prolog.htm Prolog for Squeak영어] | Squeak영어에 통합된 Prolog영어 환경 | |||
[http://www.dobrev.com/ Strawberry Prolog영어] | ○ | |||
[http://www.swi-prolog.org/ SWI-Prolog영어] | ○ | ISO 규격 | 다수의 운영 체제, 유니코드 지원 | |
TuProlog영어 | ||||
[http://www.visual-prolog.com Visual Prolog영어] | 개인은 무료 | Windows 전용 | ||
[http://xsb.sourceforge.net/ XSB] | ○ | |||
[http://www.dcc.fc.up.pt/~vsc/Yap/index.html YAP Prolog영어] | ○ | ISO 규격 | Prolog영어 컴파일러. | |
[https://github.com/mthom/scryer-prolog Scryer Prolog] | ○ | ISO 규격 | Rust 기반의 모던 Prolog영어 구현 (2016년~) |
많은 처리 시스템은 Prolog영어 기본 기능 외에도 제약 프로그래밍과 병렬 프로그래밍을 위한 확장 기능 및 Constraint Handling Rules영어와 같은 다양한 언어를 라이브러리 형태로 포함하고 있다.
15. 국제 회의
- http://www.dcc.fc.up.pt/INAP-2013/ INAP — 선언적 프로그래밍 및 지식 관리에 관한 국제 회의
- https://flops2024.github.io/ FLOPS — 함수형 및 논리 프로그래밍에 관한 국제 심포지엄
참조
[1]
서적
Programming in Prolog
Springer-Verlag
[2]
서적
Prolog programming for artificial intelligence
Addison Wesley
[3]
서적
Natural language processing for Prolog programmers
Prentice Hall
[4]
문서
See {{section link|Logic programming|History}}.
[5]
간행물
A prolog technology theorem prover: Implementation by an extended prolog compiler
[6]
서적
Building expert systems in Prolog
https://archive.org/[...]
Springer-Verlag
[7]
문서
Felty, Amy. "A logic programming approach to implementing higher-order term rewriting." Extensions of Logic Programming (1992): 135-161.
[8]
서적
Foundations of Programming Languages
https://books.google[...]
Springer
2015-01-19
[9]
서적
Inductive Synthesis of Functional Programs: Universal Planning, Folding of Finite Programs, and Schema Abstraction by Analogical Reasoning
https://books.google[...]
Springer Science & Business Media
2003-08-21
[10]
서적
Prolog and Natural Language Analysis
http://mtome.com/Pub[...]
Microtome
[11]
웹사이트
Natural Language Processing With Prolog in the IBM Watson System
http://www.cs.nmsu.e[...]
Association for Logic Programming
2014-06-13
[12]
서적
Foundations of logic programming
Springer-Verlag
[13]
문서
The Prolog terminology differs from that of [[First-order logic|logic]].
[14]
문서
ISO/IEC 13211-1:1995 Prolog, 6.3.7 Terms - double quoted list notation. [[International Organization for Standardization]], Geneva.
[15]
서적
SICStus Prolog User's Manual 4.3: Core reference documentation
https://books.google[...]
BoD – Books on Demand
2014-05-27
[16]
간행물
Coding guidelines for Prolog
[17]
간행물
Applying Techniques to Skeletons - Patterns for Prolog Programming
[18]
서적
Computational Logic: Logic Programming and Beyond
[19]
문서
D. Barker-Plummer. Cliche programming in Prolog. In M. Bruynooghe, editor, Proc. Second Workshop on Meta-Programming in Logic, pages 247--256. Dept. of Comp. Sci., Katholieke Univ. Leuven, 1990.
[20]
간행물
Representing Logic Program Schemata in Prolog
[21]
서적
Logic programming: systematic program development
Addison-Wesley
[22]
리포트
Higher-order logic programming in Prolog
Department of Computer Science, [[University of Melbourne]]
[23]
웹사이트
With regard to Prolog variables, variables only in the head are implicitly universally quantified, and those only in the body are implicitly existentially quantified
http://okmij.org/ftp[...]
2013-05-04
[24]
문서
ISO/IEC 13211-2: Modules.
[25]
간행물
Fifty Years of Prolog and Beyond
2022-11
[26]
간행물
Logtalk
http://www.cs.kuleuv[...]
2010-02-16
[27]
간행물
Using a Logic Programming Language with Persistence and Contexts
[28]
간행물
A new module system for Prolog
[29]
간행물
XSB as an efficient deductive database engine
[30]
서적
The Art of Prolog: Advanced Programming Techniques
MIT Press
[31]
문서
ISO/IEC 13211: Information technology – Programming languages – Prolog. [[International Organization for Standardization]], Geneva.
[32]
서적
Prolog: the standard: reference manual
Springer
[33]
웹사이트
ISO/IEC 13211-1:1995/Cor 1:2007
https://www.iso.org/[...]
[34]
웹사이트
ISO/IEC 13211-1:1995/Cor 2:2012
https://www.iso.org/[...]
[35]
웹사이트
ISO/IEC 13211-1:1995/Cor 3:2017
https://www.iso.org/[...]
[36]
웹사이트
ISO/IEC JTC1 SC22 WG17
http://iso.org/jtc1s[...]
[37]
웹사이트
X3J17 and the Prolog Standard
https://web.archive.[...]
2009-10-02
[38]
간행물
An abstract Prolog instruction set
http://www.ai.sri.co[...]
SRI International
1983-10
[39]
논문
High-performance logic programming with the Aquarius Prolog compiler
[40]
서적
Term indexing
Springer
[41]
학회자료
Indexing Prolog Clauses via Superimposed Code Words and Field Encoded Words
[42]
논문
Enhancing unification in PROLOG through clause indexing
[43]
논문
Tabling for non-monotonic programming
[44]
학회자료
Efficient Fixpoint Computation in Linear Tabling
http://www.sci.brook[...]
2003
[45]
논문
XSB: Extending Prolog with Tabled Logic Programming
[46]
서적
Proceedings of the 14th annual international symposium on Computer architecture - ISCA '87
[47]
학회자료
A Prolog processor based on a pattern matching memory device
Springer
[48]
논문
Performance and architectural evaluation of the PSI machine
[49]
논문
Parallel execution of prolog programs: a survey
http://oa.upm.es/111[...]
[50]
웹사이트
Statically Allocated Systems
http://www.cl.cam.ac[...]
[51]
서적
The fifth generation: an annotated bibliography
https://archive.org/[...]
Addison-Wesley
1984
[52]
논문
The Japanese national Fifth Generation project: Introduction, survey, and evaluation
1993-07-01
[53]
잡지
Software that takes games seriously
https://books.google[...]
Reed Business Information
1987-03-26
[54]
웹사이트
Computer science - Programming Languages, Syntax, Algorithms Britannica
https://www.britanni[...]
2023-07-12
[55]
문서
Logic programming for the real world
[56]
웹사이트
FAQ: Prolog Resource Guide 1/2 [Monthly posting]Section - [1-8] The Prolog 1000 Database
http://www.faqs.org/[...]
[57]
간행물
Portability of Prolog programs: theory and case-studies
http://www.swi-prolo[...]
[58]
학회자료
Re-thinking Prolog
http://okmij.org/ftp[...]
[59]
저널
Declarative vs procedural
http://dtai.cs.kuleu[...]
1994
[60]
논문
Complexity and Expressive Power of Logic Programming
[61]
논문
A polymorphic type system for prolog
[62]
서적
Types in logic programming
MIT Press
[63]
서적
Logic programming: 24th international conference, ICLP 2008, Udine, Italy, December 9-13, 2008: proceedings
[64]
논문
Reasoning about Prolog programs: From modes through types to assertions
http://www.cwi.nl/~a[...]
[65]
서적
The craft of Prolog
MIT Press
[66]
arXiv
Coding guidelines for Prolog
2010
[67]
서적
Tapsoft '87
[68]
논문
Constraint logic programming: a survey
[69]
저널
Opening the Prolog III Universe
[70]
서적
Computational Logic: Logic Programming and Beyond
[71]
웹사이트
XPCE: the SWI-Prolog native GUI library
https://www.swi-prol[...]
[72]
웹사이트
prolog-mpi
http://apps.lumii.lv[...]
Apps.lumii.lv
2010-09-16
[73]
논문
The family of concurrent logic programming languages
1989-09
[74]
학술지
SWI-Prolog and the web
https://pure.uva.nl/[...]
[75]
간행물
Using {Prolog} as the fundament for applications on the semantic web
http://ftp.informati[...]
CEUR-WS.org
[76]
문서
Processing OWL2 Ontologies using Thea: An Application of Logic Programming
http://ceur-ws.org/V[...]
2009-10-23
[77]
학술지
Secure Prolog-based mobile code
[78]
문서
The Janus System: a bridge to new prolog applications
Springer Nature Switzerland
2023
[79]
문서
The birth of Prolog
1996
[80]
학술지
The early years of logic programming
http://www.doc.ic.ac[...]
[81]
학술지
The birth of Prolog
http://alain.colmera[...]
[82]
웹사이트
Prolog: a brief history
https://www.mta.ca/~[...]
2021-11-21
[83]
뉴스
POP and SNAP
https://archive.org/[...]
2013-10-23
[84]
Citation
terminusdb/terminusdb
https://github.com/t[...]
TerminusDB
2020-12-15
[85]
문서
The birth of Prolog
[86]
문서
The Early Years of Logic Programming
[87]
문서
resolution、融合
[88]
문서
On Herbrand's Theorem
[89]
문서
The birth of Prolog
[90]
문서
The birth of Prolog
[91]
문서
David H.D.Warren
[92]
문서
W. F. Clocksin
[93]
문서
C. S. Mellish
[94]
문서
古川 康一
[95]
문서
extended self-contained Prolog
[96]
문서
萩野達也,桜川貴司,柴山悦哉
[97]
url
https://www.complang.tuwien.ac.at/ulrich/iso-prolog/SWI7_and_ISO
https://www.complang[...]
[98]
문서
Bruce A. Tate
[99]
문서
Daniel Jackson
[100]
문서
Ivan Bratko
[101]
웹사이트
K-Prolog について
http://www.kprolog.c[...]
2021-09-11
[102]
url
https://www.researchgate.net/publication/277325585_Aspects_of_Prolog_history_Logic_Programming_and_Professional_Dynamics
https://www.research[...]
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com