수색…


비고

구현

  1. SWI-Prolog (무료)
  2. SICStus (상업용)
  3. YAP (무료)
  4. GNU Prolog (무료)
  5. XSB (무료)
  6. B (상업용)
  7. IF (상업용)
  8. Ciao (무료)
  9. 미네르바 (상업용)
  10. ECLiPSe-CLP (무료)
  11. Jekejeke Prolog (상업)
  12. 프롤로그 IV
  13. 수확량 프롤로그 (무료)
  14. 비주얼 프롤로그 (상업용)

설치 또는 설정

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의 어머니입니다.

모든 내용은 XY , 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_childmother_child 와 joe 사이의 관계

모든 XY 의 관계 child_of 사이 보유 XY 의 관계의 경우 father_child 사이에 유지 YX 또는 관계 mother_child 사이에 유지 YX .

안녕하세요, 세계

안녕하세요, 인터랙티브 인터프리터의 세계

"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 은로드 할 파일을 지정합니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow