프롤로그

Prolog
프롤로그
패러다임논리
설계자알랭 콜메라우어, 로버트 코왈스키
처음 등장한1972년; 50년 전 (2012년)
안정된 릴리스
제1부 : General core - Edition 1 (1995년 6월, 27년 )
파트 2: 모듈 - 에디션1 (2000년 6월, 22년 전 (2000-06))
타이핑 분야Untype (단일 데이터 타입은 "term")
파일 이름 확장자.pl,.pro,.P
웹 사이트파트 1: www.iso.org/standard/21413.html
파트 2: www.iso.org/standard/20775.html
주요 구현
B-Prolog, Ciao, ECLiPSe, GNU Prolog, Poplog Prolog, P#, Quintus Prolog, SICStus, Strawberry, SWI-Prolog, Tau Prolog, tu Prolog, WIN-PROLOG, XSB, YAP.
사투리
ISO Prolog, Edinburgh Prolog
영향을 받다
플래너
영향받은
CHR, Clojure, Datalogger, Erlang, KL0, KL1, Mercury, Oz, Strand, Visual Prolog, XSB

프롤로그인공지능컴퓨터 언어학[1][2][3]관련된 논리 프로그래밍 언어입니다.

프롤로그는 1차 로직인 형식 로직에 뿌리를 두고 있으며, 다른 많은 프로그래밍 언어와는 달리 주로 선언형 프로그래밍 언어로 프로그램 로직이 표현되어 사실과 규칙으로 표현됩니다.이러한 관계에 대한 쿼리[4]실행하여 계산이 시작됩니다.

이 언어는 1972년 프랑스 마르세유에서 알랭 콜메라우어와 필립 루셀이 에든버러 대학의 로버트 [5][6][7]코왈스키호른 조항에 대한 절차적 해석을 바탕으로 개발 및 구현되었다.

프롤로그는 최초의 논리 프로그래밍 언어[8] 중 하나이며, 오늘날에도 가장 인기 있는 언어이며, 몇 가지 무료 및 상업용 구현을 이용할 수 있습니다.이 언어는 정리 증명,[9] 전문가 시스템,[10] 용어 재작성,[11][12] 활자 시스템 및 자동 [13]계획뿐만 아니라 본래 의도된 사용 분야인 자연 언어 [14][15]처리에도 사용되어 왔습니다.최신 Prolog 환경은 관리 및 네트워크 애플리케이션뿐만 아니라 그래피컬 사용자 인터페이스 생성을 지원합니다.

프롤로그는 데이터베이스 검색, 음성 제어 시스템, 템플릿 입력 등 규칙 기반 논리 쿼리의 이점을 얻는 특정 작업에 적합합니다.

구문 및 의미론

Prolog에서 프로그램 로직은 관계라는 관점에서 표현되며, 이러한 관계에 대한 쿼리를 실행함으로써 계산이 시작됩니다.관계 및 쿼리는 Prolog의 단일 데이터 유형인 [4]용어를 사용하여 구성됩니다.관계는 절로 정의됩니다.쿼리가 지정되면 Prolog 엔진은 부정 쿼리의 해상도 반론을 검색합니다.부정 쿼리가 반박될 수 있는 경우, 즉 부정 쿼리로 이루어진 절과 싱글톤 집합의 결합을 거짓으로 하는 모든 자유 변수에 대한 인스턴스화가 발견되면, 결과적으로 발견된 인스턴스화가 적용된 원래 쿼리는 프로그램의 논리적 결과라는 것이다.따라서 Prolog(및 기타 로직 프로그래밍 언어)는 데이터베이스, 심볼릭 수학 및 언어 해석 응용 프로그램에 특히 유용합니다.Prolog는 불순한 술어를 허용하기 때문에 특정 특수 술어의 진실 값을 확인하면 화면에 값을 인쇄하는 등의 의도적인 부작용이 발생할 수 있습니다.이것에 의해, 프로그래머는, 논리 패러다임이 불편할 때에, 종래의 명령형 프로그래밍을 어느 정도 사용할 수 있게 된다.이것은 순수 프롤로그라고 불리는 순수 논리 서브셋과 많은 외부 기능을 가지고 있다.

데이터형

Prolog의 단일 데이터 유형은 용어입니다.항은 원자, 숫자, 변수 또는 복합항입니다.

  • 원자란 본래의 의미가 없는 범용 명칭이다.원자의 예는 다음과 같다.x,red,'Taco',그리고.'some atom'.
  • 숫자는 플로트 또는 정수일 수 있습니다.ISO 표준 호환 Prolog 시스템은 Prolog 플래그를 "bounded"로 확인할 수 있습니다.대부분의 주요 Prolog 시스템은 임의의 길이의 정수 번호를 지원합니다.
  • 변수는 대문자 또는 밑줄로 시작하는 문자, 숫자 및 밑줄 문자로 구성된 문자열로 표시됩니다.변수는 임의 용어의 자리 표시자라는 점에서 논리 변수와 매우 유사합니다.
  • 복합항은 "함수"라고 불리는 원자와 여러 "인수"로 구성되는데, 이는 다시 용어입니다.복합항은 보통 함수로 작성되며, 그 뒤에 쉼표로 구분된 인수항 목록이 괄호 안에 포함됩니다.인수의 수를 용어의 아리티라고 합니다.원자는 아리티 제로의 복합항으로 볼 수 있다.복합 용어의 예는 다음과 같습니다.person_friends(zelda,[tom,jim]).

복합 용어의 특수한 경우:

  • 리스트는 항의 순서 집합입니다.용어가 콤마로 구분된 대괄호 또는 빈 목록의 경우 다음과 같이 표시됩니다.[].예를들면,[1,2,3]또는[red,green,blue].
  • 문자열:따옴표로 둘러싸인 일련의 문자는 Prolog 플래그 값에 따라 (숫자) 문자 코드 목록, 문자 목록(길이 1의 atom) 또는 원자 중 하나에 해당합니다.double_quotes.예를들면,"to be, or not to be"를 클릭합니다.[16]

ISO Prolog는atom/1,number/1,integer/1,그리고.float/1형식 [17]검사용 술어입니다.

규칙 및 사실

프롤로그 프로그램은 절에 의해 정의된 관계를 기술합니다.순수한 프롤로그는 혼 조항으로 제한됩니다.두 가지 유형의 조항이 있습니다. 사실과 규칙입니다.규칙은 형식이다.

머리 :- . 

"Head is true if Body is true"로 읽힙니다.규칙의 본문은 술어에 대한 호출로 구성되어 있으며 이를 규칙의 목표라고 합니다.기본 제공 논리 연산자 ,/2(이름을 가진 arity 2 연산자를 의미합니다).,)는 목표의 조합을 나타냅니다.;/2분리를 나타냅니다.접속사와 접속사는 본문에만 표시할 수 있으며 규칙의 선두에는 표시할 수 없습니다.

본문이 비어 있는 절을 사실이라고 합니다.예를 들어 다음과 같습니다.

고양이(톰.). 

이는 규칙과 동일합니다.

고양이(톰.) :- 진실의. 

삽입 술어true/0항상 진실입니다.

위의 사실을 고려하면 다음과 같이 질문할 수 있습니다.

톰은 고양이인가요?

 ?- 고양이(톰.).  네. 

고양이란 무엇인가?

 ?- 고양이(X).  X = 톰. 

본문이 있는 절을 규칙이라고 합니다.규칙의 예는 다음과 같습니다.

동물성(X) :- 고양이(X). 

만약 우리가 그 규칙을 추가하고 동물이 무엇인지 묻는다면?

 ?- 동물성(X).  X = 톰. 

많은 임베디드 술어의 관계성이 있기 때문에 일반적으로 여러 방향으로 사용할 수 있습니다.예를들면,length/2를 사용하여 목록의 길이를 결정할 수 있습니다(length(List, L)(목록 지정)List또한 지정된 길이의 리스트스켈레톤을 생성합니다(length(X, 5)리스트 스켈레톤과 그 길이를 모두 생성한다(length(X, L))와 마찬가지로append/32개의 리스트를 추가하는 경우는, 양쪽 모두를 사용할 수 있습니다(append(ListA, ListB, X)지정된 리스트ListA그리고.ListB또한 특정 목록을 여러 부분으로 분할합니다(append(X, Y, List)(목록 지정)List이 때문에, 많은 Prolog 프로그램에서는, 비교적 작은 라이브러리 술어 세트만으로 충분합니다.

또한 Prolog는 범용 언어로서 입력/출력, 그래픽 사용, 운영 체제와의 통신 등의 일상적인 작업을 수행하기 위한 다양한 술어를 제공합니다.이러한 술어는 관계적 의미를 부여하지 않으며 시스템에 나타나는 부작용에만 유용합니다.예를 들어 술어write/1는 화면에 용어를 표시합니다.

실행

Prolog 프로그램의 실행은 사용자가 쿼리라고 불리는 단일 목표를 게시함으로써 시작됩니다.논리적으로 Prolog 엔진은 부정 쿼리의 해결 리퍼레이션을 찾으려고 합니다.Prolog에서 사용하는 해결 방법을 SLD 해결이라고 합니다.부정 쿼리가 반박될 수 있는 경우 적절한 변수 바인딩이 있는 쿼리는 프로그램의 논리적 결과입니다.이 경우 생성된 모든 변수 바인딩이 사용자에게 보고되고 쿼리가 성공했다고 합니다.프롤로그의 실행 전략은 다른 언어로 된 함수 호출의 일반화라고 생각할 수 있습니다.한 가지 차이점은 여러 절 헤드가 특정 호출과 일치할 수 있다는 것입니다.이 경우, 시스템은 선택 포인트를 생성하고, 첫 번째 대안의 조항 선두와 목표를 통합하며, 첫 번째 대안의 목표를 계속한다.프로그램 실행 중에 목표가 실패하면 가장 최근의 선택 포인트가 생성된 이후 이루어진 모든 변수 바인딩이 취소되고 해당 선택 포인트의 다음 대안으로 실행이 계속됩니다.이 실행 전략을 시간순 역추적이라고 합니다.예를 들어 다음과 같습니다.

모자(터득터지다, 샐리).   father_child(아버지_자녀)(톰., 샐리). father_child(아버지_자녀)(톰., 에리카). father_child(아버지_자녀)(마이크, 톰.).   형제(X, Y)      :- parent_child(부모 자녀)(Z, X), parent_child(부모 자녀)(Z, Y).   parent_child(부모 자녀)(X, Y) :- father_child(아버지_자녀)(X, Y). parent_child(부모 자녀)(X, Y) :- 모자(X, Y). 

그 결과 다음 쿼리가 true로 평가됩니다.

 ?- 형제(샐리, 에리카).  네. 

이것은 다음과 같이 얻을 수 있습니다.처음에는 쿼리에 일치하는 유일한 절 헤드가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)다시 말씀드리지만, 이는 해당 사실에 의해 입증될 수 있습니다.모든 목표를 증명할 수 있기 때문에 쿼리는 성공합니다.쿼리에 변수가 포함되어 있지 않기 때문에 바인딩은 사용자에게 보고되지 않습니다.다음과 같은 변수를 포함하는 쿼리:

?- father_child(아버지_자녀)(아버지., 어린아이). 

는 백트랙킹에 관한 모든 유효한 답변을 열거한 것입니다.

위의 코드와 함께 쿼리는?- sibling(sally, sally).또한 성공합니다.원하는 경우 관련 제한을 설명하는 추가 목표를 삽입할 수 있습니다.

루프와 재귀

반복 알고리즘은 재귀 [18]술어를 사용하여 구현할 수 있습니다.

부정

내장 Prolog 술어\+/1부정을 실패로서 제공하고 비논리적인 추론을 가능하게 합니다.목표\+ illegal(X)규칙상

합법적인(X) :- \+ 불법의(X). 

다음과 같이 평가됩니다.프롤로그가 증명하려고 합니다.illegal(X)만약 그 목표에 대한 증거를 찾을 수 있다면, 원래의 목표(즉,\+ illegal(X))가 실패합니다.증거를 찾을 수 없으면 원래 목표는 성공한다.그 때문에,\+/1prefix 연산자는 쿼리 때문에 "not provable" 연산자라고 불립니다.?- \+ Goal.목표를 설정할 수 없는 경우 성공합니다.이러한 종류의 부정은, 그 주장이 「근거인 경우(즉, 변수가 없는 경우)에는 타당하다.인수에 변수가 포함되어 있고 증명 절차가 완료되면 건전성이 손실됩니다.특히 쿼리는?- legal(X).이제 합법적인 모든 것을 열거하는 데 사용할 수 없습니다.

프롤로그에서의 프로그래밍

Prolog에서는 코드를 로드하는 것을 컨설팅이라고 합니다.Prolog 프롬프트에서 쿼리를 입력하면 Prolog를 대화형으로 사용할 수 있습니다.?-솔루션이 없는 경우 Prolog는 다음과 같이 기술합니다.no솔루션이 존재하는 경우는, 인쇄됩니다.쿼리에 여러 개의 솔루션이 있는 경우 세미콜론을 입력하여 이러한 솔루션을 요청할 수 있습니다.;코드 효율, 가독성 및 [19]유지보수성을 개선하기 위한 좋은 프로그래밍 프랙티스에 관한 가이드라인이 있습니다.

다음은 Prolog로 작성된 프로그램 예시입니다.

안녕 세계

쿼리의 예:

?- 쓰다('헬로 월드!'), nl. 안녕 세계! 진실의.  ?- 

컴파일러 최적화

모든 연산은 일련의 상태 천이로 선언적으로 표현될 수 있습니다.예를 들어, 3개의 최적화 패스를 가진 최적화 컴파일러는 초기 프로그램과 그 최적화된 형태 사이의 관계로서 구현될 수 있다.

프로그램 최적화(프로그램 0, 프로그램) :-     optimization_pass_1(프로그램 0, 프로그램 1),     optimization_pass_2(프로그램 1, 프로그램2),     optimization_pass_3(프로그램2, 프로그램). 

또는 DCG 표기법을 사용하여 다음과 같이 합니다.

프로그램 최적화 --> optimization_pass_1, optimization_pass_2, optimization_pass_3. 

퀵소트

목록을 정렬된 버전과 관련짓는 QuickSort 정렬 알고리즘:

칸막이([], _, [], []). 칸막이([X Xs], 피벗, 스몰스, 빅스) :-     (   X @< 피벗 ->         스몰스 = [X 쉬다],         칸막이(Xs, 피벗, 쉬다, 빅스)     ;   빅스 = [X 쉬다],         칸막이(Xs, 피벗, 스몰스, 쉬다)     ).   퀵소트([])     --> []. 퀵소트([X Xs]) -->     { 칸막이(Xs, X, 더 작은, 더 큰) },     퀵소트(더 작은), [X], 퀵소트(더 큰). 

프롤로그 설계 패턴

설계 패턴은 소프트웨어 설계에서 일반적으로 발생하는 문제에 대한 일반적인 재사용 가능한 솔루션입니다.프롤로그에는 스켈레톤, 테크닉,[20][21] 클리쉬,[22] 프로그램 스키마타,[23] 논리 기술 스키마타,[24] 고차 프로그래밍 [25]등이 있습니다.

고차 프로그래밍

고차 술어는 하나 이상의 다른 술어를 인수로 사용하는 술어입니다.고차 프로그래밍을 지원하면 프롤로그가 1차 로직의 영역 밖으로 나가지만 ISO [26]프롤로그에는 다음과 같은 고차 술어가 내장되어 있습니다.call/1,call/2,call/3,findall/3,setof/3,그리고.bagof/3또한 임의의 프롤로그 목표를 런타임에 구성하고 평가할 수 있기 때문에 다음과 같은 상위 술어를 쉽게 작성할 수 있습니다.[27]maplist/2임의의 술어를 소정의 리스트의 각 멤버에 적용합니다.sublist/3특정 술어를 만족시키는 요소를 필터링하여 카레링[25]가능하게 합니다.

시간적 표현(백트랙에 대한 응답 대체)에서 공간적 표현(용어)으로 솔루션을 변환하기 위해 Prolog는 목록에 주어진 쿼리의 모든 응답 대체를 수집하는 다양한 전체 솔루션 술어를 가지고 있습니다.이것은 목록 이해에 사용할 수 있습니다.예를 들어, 완전수는 적절한 제수의 합과 같습니다.

 완벽하다(N) :-      사이에(1, 인피, N), U  N // 2,      모든 것을 발견하다(D, (사이에(1,U,D), N 모드 D =:= 0), Ds),      섬리스트(Ds, N). 

이는 완벽한 숫자를 열거하고 숫자가 완벽한지 확인하는 데 사용할 수 있습니다.

또 다른 예로서 술어는maplist술어를 적용하다P목록 쌍의 모든 해당 위치로 이동합니다.

지도 목록(_, [], []). 지도 목록(P, [X Xs], [Y YS]) :-    불러(P, X, Y),    지도 목록(P, Xs, YS). 

언제P모든 사람을 위해X,P(X,Y)통일하다Y하나의 고유한 가치를 가진maplist(P, Xs, Ys)기능 프로그래밍에서 지도 기능을 적용하는 것과 같습니다.Ys = map(Function, Xs).

프롤로그의 고차 프로그래밍 스타일은 HiLog①프롤로그에서 개척되었습니다.

모듈

대규모 프로그래밍을 위해 Prolog는 모듈 시스템을 제공합니다.모듈 시스템은 [28]ISO에 의해 표준화됩니다.단, 모든 Prolog 컴파일러가 모듈을 지원하는 것은 아니며 주요 Prolog [29]컴파일러의 모듈 시스템 간에 호환성 문제가 있습니다.따라서 하나의 Prolog 컴파일러로 작성된 모듈은 다른 컴파일러로 동작하지 않습니다.

해석

확정절 문법(DCG)이라고 불리는 특별한 표기법이 있다.정의되는 규칙-->/2대신:-/2프리프로세서에 의해 확장됩니다(expand_term/2(다른 언어의 매크로와 유사한 기능)을 사용하여 몇 가지 간단한 개서 규칙에 따라 일반 Prolog 구를 작성합니다.가장 주목할 만한 것은, 개서에서는, 다른 언어의 모나드와 같이, 암묵적으로 상태를 스레드 하는 [clarification needed]데 사용할 수 있는, 2개의 추가 인수가 술어에 갖추어져 있다는 것입니다.DCG는 차분 리스트에 대한 편리한 인터페이스도 제공하기 때문에 파서 또는 리스트 생성기에 자주 사용됩니다.

메타 인터프리터 및 반사

프롤로그는 호모아이코닉 언어이며 많은 성찰의 여지를 제공한다.이 암묵적인 실행 전략은 순수 Prolog 코드에 대해 간결한 메타 순환 평가자(메타 인터프리터라고도 함)를 작성할 수 있도록 합니다.

풀다(진실의). 풀다((서브골 1,서브골2)) :-      풀다(서브골 1),     풀다(서브골2). 풀다(머리) :-      조문(머리, ),     풀다(). 

어디에true빈 결합을 나타냅니다.clause(Head, Body)형식의 데이터베이스 내의 절과 통합합니다.Head :- Body.

Prolog 프로그램 자체는 Prolog 용어의 시퀀스이기 때문입니다.:-/2infix 연산자)는 내장된 메커니즘을 사용하여 쉽게 읽고 검사할 수 있습니다(예:read/1도메인 고유의 기능으로 Prolog를 증강하는 맞춤형 인터프리터를 작성할 수 있습니다.예를 들어, Sterling과 Shapiro는 불확실성으로 추론을 수행하는 메타 해석기를 제시하며, 여기에 약간의 수정을 [30]: 330 가하여 재현한다.

풀다(진실의, 1) :- !. 풀다((서브골 1,서브골2), 확실성) :-     !,     풀다(서브골 1, 확실성 1),     풀다(서브골2, 확실성 2),     확실성  (확실성 1, 확실성 2). 풀다(목표, 1) :-     빌트인(목표), !,      목표. 풀다(머리, 확실성) :-     절_cf(머리, , 확실성 1),     풀다(, 확실성 2),     확실성  확실성 1 * 확실성 2. 

이 인터프리터는 폼의[30]: 327 내장 Prolog 술어 테이블을 사용합니다.

빌트인(A  B). 빌트인(읽어주세요(X)). % 등 

및 조항은 다음과 같습니다.clause_cf(Head, Body, Certainty)이런 점들을 고려할 때론solve(Goal, Certainty)실행하다Goal결과에 대한 확실한 측정값을 얻을 수 있습니다.

튜링 완전성

순수 프롤로그는 튜링 완전인 1차 술어 논리인 혼 절의 서브셋을 기반으로 합니다.프롤로그의 튜링 완전성은 튜링 머신을 시뮬레이트하는 데 사용함으로써 나타낼 수 있습니다.

튜링(테이프 0, 테이프) :-     수행하다(문제 0, [], Ls, 테이프 0, Rs),     거꾸로 하다(Ls, Ls1),     추가하다(Ls1, Rs, 테이프).   수행하다(품질, Ls, Ls, Rs, Rs) :- !. 수행하다(문제 0, Ls0, Ls, Rs0, Rs) :-     기호.(Rs0, 심볼, rsRest),     한번만(규칙.(문제 0, 심볼, 문제 1, 뉴심, 액션.)),     액션.(액션., Ls0, Ls1, [뉴심 rsRest], Rs1),     수행하다(문제 1, Ls1, Ls, Rs1, Rs).   기호.([], b, []). 기호.([심볼 Rs], 심볼, Rs).   액션.(왼쪽, Ls0, Ls, Rs0, Rs) :- 왼쪽(Ls0, Ls, Rs0, Rs). 액션.(머물러., Ls, Ls, Rs, Rs). 액션.(맞다, Ls0, [심볼 Ls0], [심볼 Rs], Rs).   왼쪽([], [], Rs0, [b Rs0]). 왼쪽([L Ls], Ls, Rs, [L Rs]). 

튜링 머신의 간단한 예는 사실에 의해 규정된다.

규칙.(문제 0, 1, 문제 0, 1, 맞다). 규칙.(문제 0, b, 품질, 1, 머물러.). 

이 기계는 단항 부호화 중 하나의 수치로 증분합니다.임의의 수의 '1' 셀을 루프하고 마지막에 '1'을 추가합니다.쿼리 및 결과 예시:

?- 튜링([1,1,1], Ts). Ts = [1, 1, 1, 1] ; 

이것은 어떻게 연산이 일련의 상태 천이로 선언적으로 표현될 수 있는지 보여주고, Prolog에서 연속적인 관심 상태 간의 관계로서 구현된다.

실행

ISO 프롤로그

ISO Prolog 표준은 두 부분으로 구성됩니다.1995년에 발표된 ISO/IEC [27][31]13211-1은 Prolog의 핵심 요소의 많은 구현의 기존 관행을 표준화하는 것을 목표로 하고 있습니다.그것은 이전에는 애매했던 언어의 측면을 명확히 하고 휴대용 프로그램으로 이어졌다.Cor.1:2007,[32] Cor.2:[33][27]2012 및 Cor.3:[34]2017의 3가지 코리겐다가 있습니다.2000년에 발행된 ISO/IEC 13211-2는 모듈에 대한 지원을 표준에 추가합니다.표준은 ISO/IEC JTC1/SC22/WG17[35] 작업 그룹에 의해 유지됩니다.ANSI X3J17은 미국 표준 [36]기술 자문 그룹입니다.

편수

효율을 높이기 위해 프롤로그 코드는 일반적으로 추상 머신 코드로 컴파일되며, 종종 레지스터 기반의 WAM(Warren Abstract Machine)[37] 명령 세트의 영향을 받습니다.일부 구현에서는 추상 해석을 사용하여 컴파일 시 술어의 유형 및 모드 정보를 도출하거나 고성능을 [38]위해 실제 기계 코드로 컴파일합니다.프롤로그 코드의 효율적인 실장 방법을 고안하는 것은 논리 프로그래밍 커뮤니티의 활발한 연구 분야이며, 일부 실장에서는 다양한 다른 실행 방법이 사용된다.여기에는 절 2치화스택 기반 가상 [citation needed]시스템이 포함됩니다.

꼬리 재귀

프롤로그 시스템은 일반적으로 테일 재귀 또는 보다 일반적으로 테일 콜을 나타내는 결정론적 술어에 대해 테일최적화(TCO)라고 불리는 잘 알려진 최적화 방법을 구현합니다.구 스택프레임은 테일 위치에서 콜을 실행하기 전에 폐기됩니다.따라서 결정론적 테일 재귀 술어는 다른 언어의 루프와 같이 일정한 스택스페이스로 실행됩니다.

용어 색인

쿼리에서 용어와 함께 사용할 수 없는 구를 찾는 것은 구 수에서 선형입니다.용어 인덱싱은 하위 선형 시간 [39]조회를 가능하게 하는 데이터 구조를 사용합니다.인덱싱은 프로그램 성능에만 영향을 미치며 의미론에는 영향을 미치지 않습니다.대부분의 프롤로그는 모든 용어에 대한 인덱싱 비용이 많이 들기 때문에 첫 번째 용어에 대해서만 인덱싱을 사용하지만, 필드 인코딩된 단어 또는 중첩된 코드워드에 기반한 기술은 전체 쿼리와 [40][41]헤드에 걸쳐 빠른 인덱싱을 제공합니다.

해싱

WIN-PROLOG 및 SWI-Prolog와 같은 일부 Prolog 시스템은 대규모 데이터셋을 보다 효율적으로 처리할 수 있도록 해시를 구현합니다.이는 워드넷과 같은 대기업과 협력할 때 매우 큰 성능 향상을 가져오는 경향이 있습니다.

태블링

일부 Prolog 시스템(B-Prolog, XSB, SWI-Prolog, YAPCiao)은 사용자가 중간 결과를 수동으로 저장하지 않아도 되는 태블링이라는 메모화 방법을 구현하고 있습니다.태블링은 공간과 시간의 트레이드오프입니다.중간 [42][43]결과를 저장하기 위해 더 많은 메모리를 사용함으로써 실행 시간을 단축할 수 있습니다.

쿼리 평가에서 발견된 하위 목표는 이러한 하위 목표에 대한 답변과 함께 테이블에 유지됩니다.하위 목표가 다시 발생할 경우 평가는 프로그램 [44]구에 대한 해결을 다시 수행하는 것이 아니라 테이블에서 정보를 재사용합니다.

태블링은 다양한 방향으로 확장할 수 있습니다.SLG 해상도 또는 선형 태블링을 통해 재귀 술어를 지원할 수 있습니다.멀티 스레드 프롤로그 시스템에서는 태블링 결과를 스레드에 비공개로 유지하거나 모든 스레드에서 공유할 수 있습니다.증분 태블링에서는 태블링이 변경에 반응할 수 있습니다.

하드웨어에서의 실장

제5세대 컴퓨터 시스템 프로젝트에서는 전용 아키텍처를 [45][46][47]통해 보다 빠른 실행을 목표로 하드웨어에 Prolog를 구현하려는 시도가 있었습니다.또한 Prolog에는 병렬 [48]실행을 통해 속도를 높일 수 있는 여러 속성이 있습니다.보다 최근의 접근법은 제한된 Prolog 프로그램을 필드 프로그래밍 가능한 게이트 [49]배열로 컴파일하는 것입니다.그러나 범용 하드웨어의 급속한 진보는 일관되게 보다 전문화된 아키텍처를 추월하고 있습니다.

세가는 1986년 일본 시장에 출시된 세가 AI 컴퓨터용 프롤로그를 구현했다.프롤로그는 터치패드를 통해 일본어로 입력된 [50]자연어를 읽을 때 사용되었습니다.

제한 사항

Prolog는 연구와 [citation needed]교육에 널리 사용되고 있지만 Prolog 및 기타 논리 프로그래밍 언어는 컴퓨터 산업 전반에 [51]큰 영향을 미치지 않았습니다.대부분의 응용 프로그램은 산업 표준으로 볼 때 소규모이며,[51][52] 10만 줄을 넘는 코드는 거의 없습니다.대규모 프로그래밍은 모든 Prolog 컴파일러가 모듈을 지원하는 것은 아니며 주요 Prolog [29]컴파일러의 모듈 시스템 간에 호환성 문제가 있기 때문에 복잡한 것으로 간주됩니다.실장 전체에서 Prolog 코드의 이식성도 문제가 되고 있습니다만, 2007년 이후의 개발에서는, 「Edinburgh/Qintus에 의해서 파생된 Prolog 실장 패밀리내의 이식성은, 휴대 가능한 [53]실제의 애플리케이션을 유지 보수할 수 있을 만큼 충분합니다」라고 하는 것을 의미하고 있습니다.

Prolog에서 개발된 소프트웨어는 기존 프로그래밍 언어에 비해 높은 성능 저하를 초래한다는 비판을 받아왔습니다.특히, Prolog의 비결정론적 평가 전략은 결정론적 계산을 프로그래밍할 때, 또는 심지어 "상관 없음 비결정론"(모든 가능성을 역추적하는 대신 단일 선택이 이루어지는 경우)을 사용할 때 문제가 될 수 있습니다.바람직한 퍼포먼스를 얻기 위해 컷이나 기타 언어구조를 사용해야 할 수도 있습니다.프롤로그의 주요 매력 중 하나인 프로그램을 앞뒤로 [54]실행할 수 있는 기능이 파괴됩니다.

프롤로그는 순수하게 선언적인 것이 아닙니다. 연산자와 같은 구조 [55]때문에 프롤로그 프로그램을 이해하기 위해서는 절차적으로 읽어야 합니다.프롤로그 프로그램의 절 순서는 언어의 실행 전략이 [56]프롤로그에 의존하기 때문에 중요합니다.Datalog와 같은 다른 로직 프로그래밍 언어는 실제로 선언적이지만 언어를 제한합니다.그 결과, 많은 실용적인 프롤로그 프로그램은 순수하게 선언적인 논리 프로그램이 아닌 [54]프롤로그의 깊이 우선 검색 순서에 따라 작성됩니다.

내선번호

Prolog에서는 로직 프로그래밍 기능을 다양한 방향으로 확장하기 위해 다양한 구현이 개발되었습니다.여기에는 유형, 모드, 제약 로직 프로그래밍(CLP), 객체 지향 로직 프로그래밍(OOLP), 동시성, 선형 로직(LLP), 기능성 및 고차 로직 프로그래밍 기능 및 지식 기반과의 상호 운용성이 포함됩니다.

종류들

프롤로그는 입력되지 않은 언어입니다.유형을 도입하려는 시도는 1980년대까지 [57][58]거슬러 올라가며,[59] 2008년 현재도 Prolog를 유형으로 확장하려는 시도가 있습니다.형식 정보는 형식 안전뿐만 아니라 프롤로그 프로그램에 [60]대한 추론에도 유용합니다.

모드

모드 지정자 해석
+ nonvar입장시에
- var입장시에
? 지정되지 않음

Prolog 구문은 어떤 술어의 인수가 입력이고 어떤 인수가 [61]출력인지 지정하지 않습니다.단, 이 정보는 중요하므로 [62]코멘트에 포함할 것을 권장합니다.모드는 Prolog[60] 프로그램에 대한 추론을 할 때 유용한 정보를 제공하며 실행을 [63]가속화하기 위해 사용할 수도 있습니다.

제약

제약 로직 프로그래밍은 Prolog[64][65]확장하여 제약 만족도의 개념을 포함합니다.제약 로직 프로그램은 다음과 같은 절 본문에 제약을 허용합니다.A(X,Y) :- X+Y>0.이는 대규모 조합 최적화[66] 문제에 적합하며, 따라서 자동화된 시간표 작성 및 생산 일정과 같은 산업 환경에서의 애플리케이션에 유용합니다.대부분의 프롤로그 시스템에는 유한 도메인에 대한 제약 조건 솔버가 적어도1개 포함되어 있으며, 많은 경우 합리적인 숫자와 같은 다른 도메인에 대한 해결사도 포함되어 있습니다.

객체 지향

Flora-2F-logic에 기반한 객체 지향 지식 표현 및 추론 시스템이며 HiLog, 트랜잭션 논리 및 배제 가능한 추론을 포함합니다.

Logtalk는 대부분의 Prolog 구현을 백엔드 컴파일러로 사용할 수 있는 객체 지향 논리 프로그래밍 언어입니다.멀티패러다임 언어로서 프로토타입과 클래스 모두를 지원합니다.

Oblog는 Edinburgh 대학 EdCAAD의 Margaret McDougall이 Prolog를 소형으로 휴대하고 객체 지향적으로 확장한 것입니다.

Objlog는 프랑스 마르세유 CNRS의 객체 및 Prolog II를 결합한 프레임 기반 언어입니다.

Prolog++Logic Programming Associates에 의해 개발되었으며 1989년에 MS-DOS PC용으로 처음 출시되었습니다.다른 플랫폼 지원이 추가되어 1995년에 두 번째 버전이 출시되었습니다.크리스 모스가 쓴 프롤로그+에 관한 책은 1994년 애디슨 웨슬리에 의해 출판되었다.

Visual Prolog는 인터페이스, 클래스, 구현 및 객체 표현을 포함하는 다중 패러다임 언어입니다.

그래픽스

그래픽 라이브러리를 제공하는 프롤로그 시스템은 SWI-Prolog,[67] Visual Prolog, WIN-PROLOGB-Prolog입니다.

동시성

Prolog-MPI메시지 패싱 인터페이스를 통한 분산 컴퓨팅용 [68]오픈 소스 SWI-Prolog 확장입니다.또한 동시 프롤로그 프로그래밍 [69]언어도 다양합니다.

웹 프로그래밍

일부 Prolog 구현(특히 Visual Prolog, SWI-PrologCiao)은 웹 프로토콜, HTML[70]XML을 지원하는 서버 측 웹 프로그래밍지원합니다. 또한 RDF 및 OWL과 같은 [71][72]시맨틱 웹 형식을 지원하는 확장 기능도 있습니다.프롤로그는 클라이언트[73]언어로도 제안되고 있습니다.또한 Visual Prolog는 JSON-RPC웹소켓을 지원합니다.

어도비 플래시

Cedar는 무료 기본 프롤로그 통역사입니다.Cedar 버전 4 이후로는 Flash Cedar App(FCA)이 지원됩니다.이를 통해 ActionScript를 통해 Prolog에서 프로그래밍할 수 있는 새로운 플랫폼을 제공합니다.

다른.

  • F-logic은 지식 표현용 프레임/오브젝트를 사용하여 Prolog를 확장합니다.
  • 트랜잭션 로직은 Prolog를 상태를 바꾸는 업데이트 연산자의 논리 이론으로 확장합니다.그것은 모델 이론과 절차적 의미론을 모두 가지고 있다.
  • OW Prolog는 Prolog의 그래픽과 인터페이스 부족에 대응하기 위해 작성되었습니다.

다른 언어와의 인터페이스

Prolog와 다른 언어를 연결하는 프레임워크가 존재합니다.

  • LPA Intelligence Server를 사용하면 C, C#, C++, Java, VB, Delphi, .Net, Lua, Python 및 기타 언어에 LPA Prolog for Windows를 내장할 수 있습니다.LPA Prolog가 제공하는 전용 문자열 데이터 유형을 이용합니다.
  • Logic Server API를 사용하면 C, C++, Java, VB, Delphi 등의 Prolog 확장과 임베딩을 모두 할 수 있습니다.NET 및 .dll 또는 .so를 호출할 수 있는 모든 언어/환경.Amzi를 위해 구현되었습니다!프롤로그 앰지! Prolog + Logic Server 단, API 사양은 모든 구현에서 사용할 수 있습니다.
  • JPL은 기본적으로 SWI-Prolog와 함께 제공되는 양방향 Java Prolog 브리지이므로 Java와 Prolog가 서로(재귀적으로) 호출할 수 있습니다.동시성 지원이 좋은 것으로 알려져 있으며 현재 개발 중입니다.
  • 인터프로그(InterProlog)는 Java와 Prolog 의 프로그래밍 라이브러리 브리지로, 두 언어 간에 쌍방향 술어/메서드 호출을 구현합니다.Java 오브젝트는 Prolog 용어에 매핑할 수 있으며 Prolog 용어에 매핑할 수도 있습니다.Prolog 레이어에 로직 처리를 남겨두고 Java에서 GUI 및 기타 기능을 개발할 수 있습니다.XSB를 지원하며 2013년에 SWI-PrologYAP를 지원할 예정입니다.
  • Prova는 Java, 에이전트 메시징 및 대응 규칙과의 네이티브 구문 통합을 제공합니다.Prova는 미들웨어용 RBS(Rule-Based Scripting) 시스템으로 자리매김하고 있습니다.그 언어는 명령형 프로그래밍과 선언형 프로그래밍을 결합하는 데 있어 새로운 지평을 열었다.
  • PROL Java용 내장형 Prolog 엔진.작은 IDE와 몇 개의 라이브러리가 포함되어 있습니다.
  • Java용 GNU Prolog는 Java 라이브러리(gnu.prolog)로서의 ISO Prolog 구현입니다.
  • Ciao는 C, C++, Java 및 관계형 데이터베이스에 대한 인터페이스를 제공합니다.
  • C#-Prolog는 (관리 대상) C#에 기술된 Prolog 인터프리터입니다.C# 프로그램에 쉽게 통합할 수 있습니다.특징: 신뢰성 높은 고속 인터프리터, 명령줄 인터페이스, Windows 인터페이스, 내장 DCG, XML 사전 증명, SQL 사전 증명, 확장 가능.특수 목적 확장을 추가하는 데 사용할 수 있는 파서 생성기를 포함하여 전체 소스 코드를 사용할 수 있습니다.
  • PHP용 Warren Abstract Machine PHP 5.3의 Prolog 컴파일러 및 인터프리터.독립 실행형 또는 Symfony 2.1 프레임워크 내에서 사용할 수 있는 라이브러리. Stephan Buetcher의 Java 작품에서 번역된 라이브러리입니다. [stefan.buettcher.org/cs/wam/index.html]
  • tuProlog는 최소 코어를 중심으로 설계된 분산형 애플리케이션과 인프라스트럭처용 경량 Prolog 시스템으로 술어 라이브러리를 로드/언로드함으로써 정적 또는 동적으로 구성됩니다.tuProlog는 기본적으로 멀티패러다임 프로그래밍을 지원하며 Prolog 간의 깨끗하고 심리스한 통합 모델을 제공합니다.nd 메인스트림오브젝트 지향 언어: Java, tuProlog Java 버전 및 any.TuProlog의 경우 NET 기반 언어(C#, F#..)NET [74]버전

역사

Prolog라는 이름은 Philippe Rousel에 의해 programmation en logque(논리 프로그래밍 뜻하는 프랑스어)의 약자로 선택되었습니다.1972년경에 알랭 콜메라우어가 필립 루셀과 함께 로베르 코왈스키 절에 대한 절차적 해석을 바탕으로 만들었다.그것은 부분적으로 선언적 지식 표현 언어로서의 논리의 사용과 1960년대 후반과 1970년대 초반에 북미에서 유행했던 지식의 절차적 표현을 조화시키려는 욕망에 의해 동기 부여되었다.로버트 코왈스키에 따르면, 최초의 프롤로그 시스템은 1972년 콜메라우어와 필리프 [5]루셀에 의해 개발되었다.프롤로그의 첫 번째 구현은 제라드 바타니와 앙리 멜로니가 포트란어로 쓴 통역사였다.데이비드 H. D. 워렌은 이 통역사를 에든버러 대학으로 데려갔고, 거기서 대체 프런트 엔드를 구현했습니다. 이것은 대부분의 현대 구현에서 사용되는 "에딘버그 프롤로그" 구문을 정의하기 위해 왔습니다.또한 Warren은 Fernando Pereira와 협력하여 영향력 있는 DEC-10 Prolog를 제작하여 Prolog용 컴파일러를 최초로 구현했습니다.Warren은 나중에 DEC-10 Prolog의 아이디어를 일반화하여 Warren Abstract Machine을 만들었습니다.

유럽의 AI 연구진은 프롤로그를 선호했고 미국인들은 리스프를 선호해 언어들의 [75]장점에 대한 민족주의적 논쟁을 불러일으킨 것으로 알려졌다.프롤로그의 현대적 개발의 대부분은 제5세대 컴퓨터 시스템 프로젝트(FGCS)의 추진력에서 비롯되었습니다.FGCS는 첫 번째 운영체제로 커널 언어라는 이름의 프롤로그를 개발했습니다.

Pure Prolog는 원래 다음과 같은 형식의 Horn 절이 있는 분해능 정리 프로버의 사용으로 제한되었습니다.

H1:- B, ..., Bn.

정리 증명서의 적용은 다음과 같은 조항을 절차로 취급한다.

H, B, ..., B를n 표시/해결하다1. 

그러나 Pure Prolog는 곧 부정을 실패로서 포함하도록 확장되었다. 부정을 실패로서 포함하면 (Bi) 형태의 부정적인 조건이 대응하는 긍정적인 조건i B를 해결하려고 시도했다가 실패함으로써 나타난다.

오리지널 팀에 의한 Prolog의 후속 확장에 의해 제약 로직 프로그래밍 기능이 구현에 도입되었습니다.

산업에서의 사용

프롤로그는 왓슨에서 사용되었습니다.Watson은 IBM의 Deep을 사용합니다.QA 소프트웨어 및 Apache UIMA(비구조화 정보 관리 아키텍처) 프레임워크.이 시스템은 Java, C++, Prolog 등 다양한 언어로 작성되었으며 Apache Hadoop 프레임워크를 사용하여 SUSE Linux Enterprise Server 11 운영 체제에서 실행되어 분산 컴퓨팅을 제공합니다.프롤로그는 자연어 해석 트리에 대한 패턴 매칭에 사용됩니다.개발자들은 다음과 같이 말하고 있습니다. "우리는 해석 트리 및 기타 주석(이름 있는 엔티티 인식 결과 등)에 대해 패턴 매칭 규칙을 편리하게 표현할 수 있는 언어와 이러한 규칙을 매우 효율적으로 실행할 수 있는 기술이 필요했습니다.Prolog는 심플하고 [15]표현력이 뛰어나 이상적인 언어라는 것을 알게 되었습니다."프롤로그는 [76][circular reference]AI를 중심으로 한 로우코드 개발 플랫폼 진엑스(GeneXus)에 사용되고 있다.오픈 소스 그래프 데이터베이스 터미널DB는 프롤로그에 [77]구현됩니다.종착륙장DB는 협업으로 지식 그래프를 구축하고 큐레이팅하기 위해 설계되었습니다.

「 」를 참조해 주세요.

관련 언어

  • Gödel 언어는 동시 제약 논리 프로그래밍의 강력한 유형 구현입니다.SICStus Prolog를 기반으로 구축되어 있습니다.
  • Visual Prolog(이전에는 PDC Prolog 및 Turbo Prolog)는 Prolog의 강력객체 지향 사투리로 표준 Prolog와는 매우 다릅니다.Turbo Prolog는 Borland에 의해 판매되었지만, 현재는 원래 그것을 생산한 덴마크 회사 PDC(Prolog Development Center)에 의해 개발 및 판매되고 있습니다.
  • 데이터로그는 Prolog의 하위 집합입니다.계층화할 수 있는 관계로 제한되며 복합 용어를 사용할 수 없습니다.프롤로그와 달리 데이터로그는 튜링 완료 상태가 아닙니다.
  • Mercury는 정적인 다형식 시스템과 모드 및 결정론 시스템을 갖춘 대규모 소프트웨어 엔지니어링을 위한 Prolog의 분파입니다.
  • GraphTalk는 Warren의 Abstract Machine의 독점 구현으로, 추가적인 객체 지향 속성을 포함합니다.
  • 어떤[which?] 면에서는 Prolog는 Planner의 서브셋입니다.Planner의 아이디어는 나중에 Scientific Community Metapo에서 더욱 발전되었습니다.
  • Agent Speak는 다중 에이전트 시스템에서 에이전트 동작을 프로그래밍하기 위한 Prolog의 변형입니다.
  • Erlang은 Prolog 기반 구현으로 시작되었으며 Prolog의 통합 기반 구문 대부분을 유지하고 있습니다.
  • PilogPicoLisp 위에 구축된 선언형 언어이며 Prolog의 의미를 가지지만 Lisp의 구문을 사용합니다.

레퍼런스

  1. ^ Clocksin, William F.; Mellish, Christopher S. (2003). Programming in Prolog. Berlin; New York: Springer-Verlag. ISBN 978-3-540-00678-7.
  2. ^ Bratko, Ivan (2012). Prolog programming for artificial intelligence (4th ed.). Harlow, England; New York: Addison Wesley. ISBN 978-0-321-41746-6.
  3. ^ Covington, Michael A. (1994). Natural language processing for Prolog programmers. Englewood Cliffs, N.J.: Prentice Hall. ISBN 978-0-13-629213-5.
  4. ^ a b Lloyd, J. W. (1984). Foundations of logic programming. Berlin: Springer-Verlag. ISBN 978-3-540-13299-8.
  5. ^ a b Kowalski, R. A. (1988). "The early years of logic programming" (PDF). Communications of the ACM. 31: 38. doi:10.1145/35043.35046. S2CID 12259230.
  6. ^ Colmerauer, A.; Roussel, P. (1993). "The birth of Prolog" (PDF). ACM SIGPLAN Notices. 28 (3): 37. doi:10.1145/155360.155362.
  7. ^ "PROLOG:a brief history". Retrieved 21 November 2021.
  8. ^ Logic Programming history History를 참조하십시오.
  9. ^ Stickel, M. E. (1988). "A prolog technology theorem prover: Implementation by an extended prolog compiler". Journal of Automated Reasoning. 4 (4): 353–380. CiteSeerX 10.1.1.47.3057. doi:10.1007/BF00297245. S2CID 14621218.
  10. ^ Merritt, Dennis (1989). Building expert systems in Prolog. Berlin: Springer-Verlag. ISBN 978-0-387-97016-5.
  11. ^ 펠티, 에이미 "고차 용어 개서를 구현하기 위한 논리 프로그래밍 접근법"논리 프로그래밍의 확장(1992) : 135-161.
  12. ^ Kent D. Lee (19 January 2015). Foundations of Programming Languages. Springer. pp. 298–. ISBN 978-3-319-13314-0.
  13. ^ Ute Schmid (21 August 2003). Inductive Synthesis of Functional Programs: Universal Planning, Folding of Finite Programs, and Schema Abstraction by Analogical Reasoning. Springer Science & Business Media. ISBN 978-3-540-40174-2.
  14. ^ Fernando C. N. Pereira; Stuart M. Shieber (2005). Prolog and Natural Language Analysis. Microtome.
  15. ^ a b Adam Lally; Paul Fodor (31 March 2011). "Natural Language Processing With Prolog in the IBM Watson System". Association for Logic Programming. Watson(컴퓨터)도 참조해 주세요.
  16. ^ ISO/IEC 13211-1:1995 프롤로그, 6.3.7 용어 - 이중 따옴표 목록 표기법.제네바 국제 표준화 기구
  17. ^ "Verify Type of a Term - SWI-Prolog".
  18. ^ Carlsson, Mats (27 May 2014). SICStus Prolog User's Manual 4.3: Core reference documentation. BoD – Books on Demand. ISBN 9783735737441 – via Google Books.
  19. ^ Covington, Michael A.; Bagnara, Roberto; O'Keefe, Richard A.; Wielemaker, Jan; Price, Simon (2011). "Coding guidelines for Prolog". Theory and Practice of Logic Programming. 12 (6): 889–927. arXiv:0911.2899. doi:10.1017/S1471068411000391. S2CID 438363.
  20. ^ Kirschenbaum, M.; Sterling, L.S. (1993). "Applying Techniques to Skeletons". Constructing Logic Programs, (Ed. J.M.J. Jacquet): 27–140. CiteSeerX 10.1.1.56.7278.
  21. ^ Sterling, Leon (2002). "Patterns for Prolog Programming". Computational Logic: Logic Programming and Beyond. Lecture Notes in Computer Science / Lecture Notes in Artificial Intelligence. Vol. 2407. pp. 17–26. doi:10.1007/3-540-45628-7_15. ISBN 978-3-540-43959-2.
  22. ^ D. 바커 플러머프롤로그의 진부한 프로그래밍.M. Bruynooghe, 편집자, Proc.논리에서의 메타 프로그래밍에 관한 제2차 워크숍, 247-256페이지.컴포넌트 부서Catholike University의 Sci.루벤, 1990년
  23. ^ Gegg-harrison, T. S. (1995). Representing Logic Program Schemata in Prolog. Procs Twelfth International Conference on Logic Programming. pp. 467–481.
  24. ^ Deville, Yves (1990). Logic programming: systematic program development. Wokingham, England: Addison-Wesley. ISBN 978-0-201-17576-9.
  25. ^ a b Naish, Lee (1996). Higher-order logic programming in Prolog (Report). Department of Computer Science, University of Melbourne. CiteSeerX 10.1.1.35.4505.
  26. ^ "With regard to Prolog variables, variables only in the head are implicitly universally quantified, and those only in the body are implicitly existentially quantified". Retrieved 2013-05-04.
  27. ^ a b c ISO/IEC 13211: 정보기술 - 프로그래밍 언어 - 프롤로그.제네바 국제 표준화 기구
  28. ^ ISO/IEC 13211-2: 모듈.
  29. ^ a b Moura, Paulo (August 2004), "Logtalk", Association of Logic Programming, 17 (3)
  30. ^ a b Shapiro, Ehud Y.; Sterling, Leon (1994). The Art of Prolog: Advanced Programming Techniques. Cambridge, Massachusetts: MIT Press. ISBN 978-0-262-19338-2.
  31. ^ A. Ed-Dbali; Deransart, Pierre; L. Cervoni (1996). Prolog: the standard: reference manual. Berlin: Springer. ISBN 978-3-540-59304-1.
  32. ^ "ISO/IEC 13211-1:1995/Cor 1:2007 -".
  33. ^ "ISO/IEC 13211-1:1995/Cor 2:2012 -".
  34. ^ "ISO/IEC 13211-1:1995/Cor 3:2017 -".
  35. ^ "ISO/IEC JTC1 SC22 WG17".[영구 데드링크]
  36. ^ "X3J17 and the Prolog Standard". Archived from the original on 2009-08-23. Retrieved 2009-10-02.
  37. ^ 데이비드 H. D. 워렌"추상 프롤로그 명령 세트"테크니컬 노트 309, SRI International, Menlo Park, CA, 1983년 10월
  38. ^ Van Roy, P.; Despain, A. M. (1992). "High-performance logic programming with the Aquarius Prolog compiler". Computer. 25: 54–68. doi:10.1109/2.108055. S2CID 16447071.
  39. ^ Graf, Peter (1995). Term indexing. Springer. ISBN 978-3-540-61040-3.
  40. ^ Wise, Michael J.; Powers, David M. W. (1986). Indexing Prolog Clauses via Superimposed Code Words and Field Encoded Words. International Symposium on Logic Programming. pp. 203–210.
  41. ^ Colomb, Robert M. (1991). "Enhancing unification in PROLOG through clause indexing". The Journal of Logic Programming. 10: 23–44. doi:10.1016/0743-1066(91)90004-9.
  42. ^ Swift, T. (1999). "Tabling for non‐monotonic programming". Annals of Mathematics and Artificial Intelligence. 25 (3/4): 201–240. doi:10.1023/A:1018990308362. S2CID 16695800.
  43. ^ Zhou, Neng-Fa; Sato, Taisuke (2003). "Efficient Fixpoint Computation in Linear Tabling" (PDF). Proceedings of the 5th ACM SIGPLAN International Conference on Principles and Practice of Declarative Programming: 275–283.
  44. ^ Swift, T.; Warren, D. S. (2011). "XSB: Extending Prolog with Tabled Logic Programming". Theory and Practice of Logic Programming. 12 (1–2): 157–187. arXiv:1012.5123. doi:10.1017/S1471068411000500. S2CID 6153112.
  45. ^ Abe, S.; Bandoh, T.; Yamaguchi, S.; Kurosawa, K.; Kiriyama, K. (1987). "High performance integrated Prolog processor IPP". Proceedings of the 14th annual international symposium on Computer architecture - ISCA '87. p. 100. doi:10.1145/30350.30362. ISBN 978-0818607769. S2CID 10283148.
  46. ^ Robinson, Ian (1986). A Prolog processor based on a pattern matching memory device. Third International Conference on Logic Programming. Lecture Notes in Computer Science. Vol. 225. Springer. pp. 172–179. doi:10.1007/3-540-16492-8_73. ISBN 978-3-540-16492-0.
  47. ^ Taki, K.; Nakajima, K.; Nakashima, H.; Ikeda, M. (1987). "Performance and architectural evaluation of the PSI machine". ACM SIGPLAN Notices. 22 (10): 128. doi:10.1145/36205.36195.
  48. ^ Gupta, G.; Pontelli, E.; Ali, K. A. M.; Carlsson, M.; Hermenegildo, M. V. (2001). "Parallel execution of prolog programs: a survey". ACM Transactions on Programming Languages and Systems. 23 (4): 472. doi:10.1145/504083.504085. S2CID 2978041.
  49. ^ "Statically Allocated Systems".
  50. ^ "Software that takes games seriously". New Scientist. Reed Business Information. March 26, 1987. p. 34 – via Google Books.{{cite magazine}}: CS1 maint :url-status (링크)
  51. ^ a b 실제 세계를 위한 논리 프로그래밍입니다.졸탄 소모기, 퍼거스 헨더슨 토마스 콘웨이, 리처드 오키프ILPS'95 로직 프로그래밍의 미래를 위한 비전에 관한 포스트 컨퍼런스 워크숍의 진행.
  52. ^ "FAQ: Prolog Resource Guide 1/2 [Monthly posting] Section - [1-8] The Prolog 1000 Database".
  53. ^ Jan Wiellemaker와 Virtor Santos Costa: Prolog 프로그램의 휴대성: 이론과 사례 연구.CICLOPS-WLPE 워크숍 2010.
  54. ^ a b Kiselyov, Oleg; Kameyama, Yukiyoshi (2014). Re-thinking Prolog. Proc. 31st meeting of the Japan Society for Software Science and Technology.
  55. ^ Franzen, Torkel (1994), "Declarative vs procedural", Association of Logic Programming, 7 (3)
  56. ^ Dantsin, Evgeny; Eiter, Thomas; Gottlob, Georg; Voronkov, Andrei (2001). "Complexity and Expressive Power of Logic Programming". ACM Computing Surveys. 33 (3): 374–425. CiteSeerX 10.1.1.616.6372. doi:10.1145/502807.502810. S2CID 518049.
  57. ^ Mycroft, A.; O'Keefe, R. A. (1984). "A polymorphic type system for prolog". Artificial Intelligence. 23 (3): 295. doi:10.1016/0004-3702(84)90017-1.
  58. ^ Pfenning, Frank (1992). Types in logic programming. Cambridge, Massachusetts: MIT Press. ISBN 978-0-262-16131-2.
  59. ^ Schrijvers, Tom; Santos Costa, Vitor; Wielemaker, Jan; Demoen, Bart (2008). "Towards Typed Prolog". In Maria Garcia de la Banda; Enrico Pontelli (eds.). Logic programming : 24th international conference, ICLP 2008, Udine, Italy, December 9-13, 2008 : proceedings. Lecture Notes in Computer Science. Vol. 5366. pp. 693–697. doi:10.1007/978-3-540-89982-2_59. ISBN 9783540899822.
  60. ^ a b Apt, K. R.; Marchiori, E. (1994). "Reasoning about Prolog programs: From modes through types to assertions". Formal Aspects of Computing. 6 (S1): 743. CiteSeerX 10.1.1.57.395. doi:10.1007/BF01213601. S2CID 12235465.
  61. ^ O'Keefe, Richard A. (1990). The craft of Prolog. Cambridge, Massachusetts: MIT Press. ISBN 978-0-262-15039-2.
  62. ^ Michael Covington; Roberto Bagnara; et al. (2010). "Coding guidelines for Prolog". arXiv:0911.2899 [cs.PL].
  63. ^ Roy, P.; Demoen, B.; Willems, Y. D. (1987). "Improving the execution speed of compiled Prolog with modes, clause selection, and determinism". Tapsoft '87. Lecture Notes in Computer Science. Vol. 250. pp. 111. doi:10.1007/BFb0014976. ISBN 978-3-540-17611-4.
  64. ^ Jaffar, J. (1994). "Constraint logic programming: a survey". The Journal of Logic Programming. 19–20: 503–581. doi:10.1016/0743-1066(94)90033-7.
  65. ^ Colmerauer, Alain (1987). "Opening the Prolog III Universe". Byte. August.
  66. ^ Wallace, M. (2002). "Constraint Logic Programming". Computational Logic: Logic Programming and Beyond. Lecture Notes in Computer Science. Vol. 2407. pp. 512–556. doi:10.1007/3-540-45628-7_19. ISBN 978-3540456285.
  67. ^ "XPCE graphics library".
  68. ^ "prolog-mpi". Apps.lumii.lv. Retrieved 2010-09-16.
  69. ^ 에후드 샤피로.동시 로직 프로그래밍 언어 ACM Computing Survey 패밀리.1989년 9월
  70. ^ Wielemaker, J.; Huang, Z.; Van Der Meij, L. (2008). "SWI-Prolog and the web" (PDF). Theory and Practice of Logic Programming. 8 (3): 363. doi:10.1017/S1471068407003237. S2CID 5404048.
  71. ^ Jan Wielemaker and Michiel Hildebrand and Jacco van Ossenbruggen (2007), S. Heymans; A. Polleres; E. Ruckhaus; D. Pearse; G. Gupta (eds.), "Using {Prolog} as the fundament for applications on the semantic web" (PDF), Proceedings of the 2nd Workshop on Applications of Logic Programming and to the Web, Semantic Web and Semantic Web Services, CEUR Workshop Proceedings, Porto, Portugal: CEUR-WS.org, vol. 287, pp. 84–98
  72. ^ Tha를 이용한 OWL2 Ontologies 처리: 논리 프로그래밍의 응용 프로그램.반젤리스 바실리아디스, 얀 위엘레메이커, 크리스 멍갈.2009년 10월 23일~24일 미국 버지니아 주 샹틸리, 제5회 OWL: 경험과 방향에 관한 국제 워크숍(OWLED 2009
  73. ^ Loke, S. W.; Davison, A. (2001). "Secure Prolog-based mobile code". Theory and Practice of Logic Programming. 1 (3): 321. arXiv:cs/0406012. CiteSeerX 10.1.1.58.6610. doi:10.1017/S1471068401001211. S2CID 11754347.
  74. ^ "Archived copy". Archived from the original on 2019-03-17. Retrieved 2019-06-08.{{cite web}}: CS1 maint: 제목으로 아카이브된 복사(링크)
  75. ^ Pountain, Dick (October 1984). "POP and SNAP". BYTE. p. 381. Retrieved 23 October 2013.
  76. ^ "Wikipedia GeneXus Page".
  77. ^ terminusdb/terminusdb, TerminusDB, 2020-12-13, retrieved 2020-12-15

추가 정보