현재 우분투에서 SWI-Prolog가 컴파일이 안되는 관계로(XPM 라이브러리 문제라고 한다.) GNU-Prolog를 사용하게 되었다.
헌데 사용하기가 만만치 않다.
일단 gprolog라는 인터프리터를 띄어놓은뒤, 각 함수정의가 되지 않는다. 무조건 에러를 발생시키는 듯....
하지만 내장 함수(?)같은 것들은 잘 동작하는 것 같다.
이런식으로 나오는 걸 봐서는, 뭔가 다른 방법으로 정의해야하지 않나 싶다.
그래서 메뉴얼을 뒤져 보았다. <메뉴얼 사이트 : http://www.gprolog.org/#manual >
해석해본 결과, 사용자의 코드를 인식하고 인터프리터 내에서 사용하기 위해서는 컴파일이 되어야 하는 듯 하다. 그래서 무작정 인터프리터를 실행시키면, 내장 술어(built-in predicates)를 사용하는 것이다.
사용자 정의 술어를 사용하는 두 가지의 방법을 아래에서 소개하겠다.
1. 컴파일후 실행
뭐 당연하다면 당연할 수 있는데, 컴파일하고 실행하면 잘된다.
parent( mary, john).
parent(jane, karen).
parent(jane, bill).
parent(john, jim).
sibling(A, B) :- parent(X, A), parent(X, B), A\=B.
grandparent(A, B) :- parent(A, X), parent(X, B).
cousin(A, B) :- sibling(X,Y), parent(X, A), parent(Y, B).
그럼 해당 디렉토리에 family라는 컴파일된 실행파일이 생길 것이다. 그리고 이 파일을
이 명령어로 실행시키면 gprolog 인터프리터가 뜨게 될 것이다. 이 화면에서 원하는 질의를 수행하면 원하는 결과가 나오는 것을 볼 수 있다.
2.인터프리터에서 술어 정의
위에서 말했다시피, 사용자 정의 술어는 컴파일되어야 실행할 수 있(는것 같)다. gprolog 쉘에서 다음과 같이 입력하자.
그 뒤 위의 코드작성과 똑같은 원리로 술어를 정의해주면 된다.
근데 해봤더니, 줄 단위로만 작성할 수 있는 듯 했다. 줄넘어가면 수정이 안되는 것 같은데, 뭔가 방법이 있을 듯 하다.
아무튼 이렇게 정의하고 끝날때는 ctrl+d를 입력해서 종료를 알려주면 된다. 그럼 다음과 같이 컴파일 되었음을 알려줄 것이다.
자 일단 이것으로 프롤로그 포스팅은 마친다.
헌데 사용하기가 만만치 않다.
일단 gprolog라는 인터프리터를 띄어놓은뒤, 각 함수정의가 되지 않는다. 무조건 에러를 발생시키는 듯....
하지만 내장 함수(?)같은 것들은 잘 동작하는 것 같다.
?- append([a,b], [c,d], X).
X = [a,b,c,d]
yes
X = [a,b,c,d]
yes
이런식으로 나오는 걸 봐서는, 뭔가 다른 방법으로 정의해야하지 않나 싶다.
그래서 메뉴얼을 뒤져 보았다. <메뉴얼 사이트 : http://www.gprolog.org/#manual >
해석해본 결과, 사용자의 코드를 인식하고 인터프리터 내에서 사용하기 위해서는 컴파일이 되어야 하는 듯 하다. 그래서 무작정 인터프리터를 실행시키면, 내장 술어(built-in predicates)를 사용하는 것이다.
사용자 정의 술어를 사용하는 두 가지의 방법을 아래에서 소개하겠다.
1. 컴파일후 실행
뭐 당연하다면 당연할 수 있는데, 컴파일하고 실행하면 잘된다.
FILE NAME : family.pl
parent( mary, jane).parent( mary, john).
parent(jane, karen).
parent(jane, bill).
parent(john, jim).
sibling(A, B) :- parent(X, A), parent(X, B), A\=B.
grandparent(A, B) :- parent(A, X), parent(X, B).
cousin(A, B) :- sibling(X,Y), parent(X, A), parent(Y, B).
Code : family.pl
위와 같이 코드를 작성하고 다음 명령을 통해 컴파일을 수행하자.
$gplc family.pl
그럼 해당 디렉토리에 family라는 컴파일된 실행파일이 생길 것이다. 그리고 이 파일을
$./family
이 명령어로 실행시키면 gprolog 인터프리터가 뜨게 될 것이다. 이 화면에서 원하는 질의를 수행하면 원하는 결과가 나오는 것을 볼 수 있다.
[foon ~/문서/Private/Prolog]$ ./family
GNU Prolog 1.3.0
By Daniel Diaz
Copyright (C) 1999-2007 Daniel Diaz
| ?- parent(mary, jane).
true ?
yes
| ?-
GNU Prolog 1.3.0
By Daniel Diaz
Copyright (C) 1999-2007 Daniel Diaz
| ?- parent(mary, jane).
true ?
yes
| ?-
Figure : 실행화면
2.인터프리터에서 술어 정의
위에서 말했다시피, 사용자 정의 술어는 컴파일되어야 실행할 수 있(는것 같)다. gprolog 쉘에서 다음과 같이 입력하자.
| ?- [user].
compiling user for byte code...
compiling user for byte code...
그 뒤 위의 코드작성과 똑같은 원리로 술어를 정의해주면 된다.
근데 해봤더니, 줄 단위로만 작성할 수 있는 듯 했다. 줄넘어가면 수정이 안되는 것 같은데, 뭔가 방법이 있을 듯 하다.
아무튼 이렇게 정의하고 끝날때는 ctrl+d를 입력해서 종료를 알려주면 된다. 그럼 다음과 같이 컴파일 되었음을 알려줄 것이다.
| ?- [user].
compiling user for byte code...
parent(may, jane).
parent(may, john).
parent(jane, karen).
parent(jaen, bill).
parent(john, jim).
sibling(A,B) :- parent(X,A), parent(X,B), A\=B.
grandparent(A,B) :- parent(A,X), parent(X,B).
cousin(A,B):-sibling(X,Y), parent(X,A), parent(Y,B).
user compiled, 9 lines read - 1728 bytes written, 97603 ms
yes
| ?-
compiling user for byte code...
parent(may, jane).
parent(may, john).
parent(jane, karen).
parent(jaen, bill).
parent(john, jim).
sibling(A,B) :- parent(X,A), parent(X,B), A\=B.
grandparent(A,B) :- parent(A,X), parent(X,B).
cousin(A,B):-sibling(X,Y), parent(X,A), parent(Y,B).
user compiled, 9 lines read - 1728 bytes written, 97603 ms
yes
| ?-
Figure2 : 인터프리터 술어 정의
| ?- parent(may, jane).
true ?
yes
| ?- sibling(X,Y).
X = jane
Y = john ?
yes
| ?-
true ?
yes
| ?- sibling(X,Y).
X = jane
Y = john ?
yes
| ?-
Figure3 : 실행화면
자 일단 이것으로 프롤로그 포스팅은 마친다.
'Tips' 카테고리의 다른 글
안드로이드 부트로더 문제 (0) | 2013.10.24 |
---|---|
안드로이드 최신버전(>=4.2)에서 USB Debugging 사용하기 (0) | 2013.10.24 |
binutils 크로스 컴파일 방법 (0) | 2012.08.10 |
Python-Twitter (0) | 2011.07.27 |
A* Search (0) | 2011.04.02 |