Prolog Language 튜토리얼
Prolog 언어 시작하기
수색…
비고
구현
- SWI-Prolog (무료) swi-prolog
- c로 구현 됨
- SICStus (상업용) sicstus-prolog
- YAP (무료) 얍
- GNU Prolog (무료) gnu-prolog
- XSB (무료) xsb
- B (상업용) b-prolog
- IF (상업용)
- Ciao (무료)
- 미네르바 (상업용)
- ECLiPSe-CLP (무료) eclipse-clp
- Jekejeke Prolog (상업)
- 프롤로그 IV
- 수확량 프롤로그 (무료)
- 비주얼 프롤로그 (상업용) 비주얼 - 프롤로그
설치 또는 설정
SWI-Prolog
Windows 및 Mac :
- 공식 웹 사이트에서 SWI-Prolog를 다운로드하십시오.
- 설치 프로그램 지침에 따라 간단하게 설치하십시오.
Linux (PPA) :
PPA
ppa:swi-prolog/stable
을 시스템의 소프트웨어 소스에 추가하십시오 (개발자는ppa:swi-prolog/devel
선택할 수 있습니다).터미널 (Ctrl + Alt + T)을 열고 다음을 입력하십시오 :
sudo add-apt-repository ppa:swi-prolog/stable
그런 다음 패키지 정보를 업데이트하십시오 :
sudo apt-get update
이제 패키지 관리자를 통해 SWI-Prolog를 설치하십시오 :
sudo apt-get install swi-prolog
이제 SWI-Prolog를 명령 줄을 통해
swipl
명령으로 시작할 수 있습니다.
추가 / 3
append([], Bs, Bs).
append([A|As], Bs, [A|Cs]) :-
append(As, Bs, Cs).
append/3
은 가장 잘 알려진 프롤로그 관계 중 하나입니다. 세 개의 인수 사이의 관계를 정의하며 세 번째 인수가 첫 번째 및 두 번째 인수에 지정된 목록의 연결을 나타내는 목록 인 경우 true입니다.
특히 좋은 Prolog 코드의 경우와 같이 append/3
을 여러 방향 으로 사용할 수 있습니다. 다음 용도로 사용할 수 있습니다.
완전히 또는 부분적으로 인스턴스화 된 두 개의 목록을 추가하십시오 .
?- A = [1, 2, 3], B=[4, 5, 6], append(A, B, Y) Output: A = [1, 2, 3], B = [4, 5, 6], Y = [1, 2, 3, 4, 5, 6].
완전하게 인스턴스화 된 3 개의리스트에 대해서 관계가 true인가 어떤지를 조사 합니다.
?- A = [1, 2, 3], B = [4, 5], C = [1, 2, 3, 4, 5, 6], append(A, B, C) Output: false
주어진리스트에 2 개의리스트를 추가 하는 모든 가능한 방법을 생성 합니다 :
?- append(A, B, [1, 2, 3, 4]). Output: A = [], B = [1, 2, 3, 4] ; A = [1], B = [2, 3, 4] ; A = [1, 2], B = [3, 4] ; A = [1, 2, 3], B = [4] ; A = [1, 2, 3, 4], B = [] ; false.
CLP (FD) 제약 조건
CLP (FD) 제약 조건 은 모든 심각한 Prolog 구현에 의해 제공됩니다. 그것들은 우리가 순수한 방식으로 정수 에 대해 추론 할 수있게 해줍니다.
?- X #= 1 + 2.
X = 3.
?- 5 #= Y + 2.
Y = 3.
데이터베이스 프로그래밍
프롤로그는 모든 것을 다음과 같이 분류합니다.
- Atoms - 대문자로 시작하지 않는 모든 문자 시퀀스입니다. 예 :
a
,b
,okay
- 숫자 - 숫자 에 대한 특수 구문이 없으므로 선언 할 필요가 없습니다. 예 :
1
,22
,35.8
- 변수 - 대문자 또는 밑줄 (
_
)로 시작하는 문자열입니다. 예 :X
,Y
,Abc
,AA
- 복잡한 용어 - 그들은 펑터 (functor) 와 일련의 주장 들로 만들어집니다. 복잡한 용어의 이름은 항상 원자이며, 인수는 원자 또는 변수가 될 수 있습니다. 예를 들면
father(john,doe)
,relative(a)
,mother(X,Y)
.
논리 데이터베이스는 일련의 사실 과 규칙을 포함 합니다.
원자를 인수로 갖는 복잡한 용어를 사실이라고 부르며 변수를 변수로 갖는 복잡한 용어를 규칙이라고합니다.
프롤로그에있는 사실의보기 :
father_child(fred, susan).
mother_child(hillary, joe).
프롤로그에서 규칙의 예 :
child_of(X,Y):-
father_child(Y,X)
;
mother_child(Y,X).
참고 ;
여기는 or
다른 언어의 연산자와 같습니다.
프롤로그는 선언적 언어이며 다음과 같이이 데이터베이스를 읽을 수 있습니다.
프레드는 수잔의 아버지이다.
hillary은 joe의 어머니입니다.
모든 내용은
X
와Y
,X
의 자식 인Y
하면Y
의 아버지X
또는Y
의 어머니X
.
사실 유한 한 사실 및 / 또는 규칙 집합이 논리 프로그램으로 구성됩니다.
이러한 프로그램의 사용은 쿼리를 통해 입증됩니다. 쿼리를 사용하면 논리 프로그램에서 정보를 검색 할 수 있습니다.
데이터베이스를 인터프리터에로드하려면 (인터프리터를 실행중인 디렉토리에 데이터베이스를 저장했다는 가정하에) 다음과 같이 입력하면됩니다.
?- [nameofdatabase].
nameofdatabase
를 실제 파일 이름으로 nameofdatabase
여기에서 .pl
확장자는 파일 이름에 제외됩니다.
위 프로그램 및 결과에 대한 인터프리터의 쿼리 예 :
?- child_of(susan,fred).
true
?- child_of(joe,hillary).
true
?- child_of(fred,susan).
false
?- child_of(susan,hillary).
false
?- child_of(susan,X).
X = fred
?- child_of(X,Y).
X = susan,
Y = fred ;
X = joe,
Y = hillary.
위의 검색어와 그 답변은 다음과 같이 읽을 수 있습니다.
수잔이 프레드의 자식 이니? - 사실
조는 힐러리의 자식인가? - 사실
수잔의 자식인가? - 거짓
수잔이 힐러리의 자식 이니? - 거짓
누가 수잔이란 아이인가? - 프레드
이것은 우리가 프롤로그에서 로직을 프로그래밍하는 방법입니다. 논리 프로그램은 더 공식적으로 : 공리 (公理)의 집합, 또는 객체들 사이의 관계 (술어라고도 함)를 정의합니다. 위의 데이터베이스를보다 공식적인 논리 방식으로 해석하는 다른 방법은 다음과 같습니다.
father_child
와 프레드와 수잔의 관계
mother_child
와mother_child
와 joe 사이의 관계
모든
X
및Y
의 관계child_of
사이 보유X
와Y
의 관계의 경우father_child
사이에 유지Y
및X
또는 관계mother_child
사이에 유지Y
및X
.
안녕하세요, 세계
안녕하세요, 인터랙티브 인터프리터의 세계
"Hello, World!"를 인쇄하려면 Prolog 인터프리터에서 (여기서 우리는 swipl
을 사용 swipl
, SWI Prolog의 쉘) :
$ swipl
<...banner...>
?- write('Hello, World!'), nl.
?-
는 시스템 프롬프트입니다 : 시스템은 사용자가 a로 끝나야하는 일련의 목표 (예 : 쿼리 )를 입력 할 준비가되었음을 나타냅니다 .
(마침표).
여기 쿼리 write('Hello World!'), nl
에는 두 가지 목표가 있습니다.
-
write('Hello World!')
:'Hello World!'
표시되어야 하고 (,
) - 새 줄 (
nl
)이 따라 와야합니다.
write/1
( /1
은 술어가 하나의 인수를 취하는 것을 나타내는 데 사용됨)이고 nl/0
은 내장 술어입니다 (이 정의는 사전에 Prolog 시스템에서 제공됩니다). 내장 술어는 순수 Prolog 정의로 얻을 수 없거나 프로그래머가 정의하지 않아도되는 기능을 제공합니다.
출력 :
안녕, 세상!
예
yes
로 끝나면 쿼리가 성공한 것입니다. 일부 시스템에서는 yes
대신 true
가 인쇄됩니다.
안녕하세요, 파일에서 가져온 세계
hello_world.pl
이라는 새 파일을 열고 다음 텍스트를 삽입하십시오.
:- initialization hello_world, halt.
hello_world :-
write('Hello, World!'), nl.
initialization
지시문은 목표 hello_world, halt
가 파일이로드 될 때 호출되어야한다고 지정합니다. halt
하면 프로그램이 종료됩니다.
이 파일은 Prolog 실행 파일에 의해 실행될 수 있습니다. 정확한 플래그는 Prolog 시스템에 의존합니다. SWI Prolog를 사용하는 경우 :
$ swipl -q -l hello_world.pl
그러면 출력이 Hello, World!
. -q
플래그는 swipl
실행을 호출 할 때 일반적으로 표시되는 배너를 표시하지 swipl
. -l
은로드 할 파일을 지정합니다.