관련 포스팅
1. Perl과제 기록
2. Pascal과제 기록
3. Prolog과제 기록
프로그래밍언어 시간에 과제로 부여한 Prolog이란 언어로 여러가지 자료구조들을 이용한 프로그램을 구현을 했습니다.
- 임의의 숫자 12개를 입력 받은 이진 트리를 출력하시오.
- F0 = 0, F1 = 1 그리고 Fn = Fn-1 + Fn-2 (n≥2)일 때, 임의의 숫자를 입력받아서 그 수보다 작은 수(혹은 같은수)까지의 피보나치 수열을 출력하시오.
- 임의의 숫자 12개를 입력 받아 퀵정렬 알고리즘을 사용하여 정렬하시오.
- 다음 그래프에서 1번 노드에서 시작해서 10번 노드로 가는 최단거리를 Dijkstra 알고리즘을 이용해서 구하시오.
- 하노이 탑 알고리즘 구현하시오. 세 개의 막대가 있고 원판의 개수는 임의로 입력 받는다.
프로그래밍 언어 3월달 과제는 Perl이라는 언어로 위의 자료구조들을 구현하는 것이였는데 4월달 과제는 Pascal이라는 언어로 위의 자료구조들을 구현하는 것이었습니다. 이번 5월달 과제는 Prolog란 언어로 위의 자료구조들을 구현하시요
조교님께서 가르쳐주신다고 했으나 20분만에 상황 종료. 이렇게 깔고 프로그램은 이렇게 돌아가요. =_=;;
Prolog는 논리형 프로그래밍 언어입니다.
PROgramming inLOGic 의 준말로서 논리식을 토대로 오브젝트와 오브젝트 간의 관계에 관한 문제를 해결하기 위해 사용합니다.
이 언어는 인공지능, 계산 언어학, 자연언어 처리 분야에서 많이 사용된다고 하네요.
그런데 이 언어는 기존에 알고 있던 C,C++,JAVA,Pascal, Perl, Python과는 다르게 구성되어 있더군요
일반적인 언어라면 컴파일러가 알이 먹을수 있는 언어를 말하는데 이 언어는 논리적인 구성으로 된 언어라고 할까나?
Prolog에는 기본요소가 3가지있습니다.
- 사실(facts)
- 질문(questions)
- 규칙(rules)
사실(facts)관계와 객체의 이름은 소문자로 시작됩니다.
관계의 이름을 먼저 쓰고, 객체들은 괄호 안에 쉼표로 구분합니다.
사실은 항상 ‘.’으로 끝납니다.
예제)
John likes Mary -> likes(john,mary).
아래 표는
사실과 규칙의 표현입니다.
PROLOG | 논리식 |
, | and(∧) |
; | or(∨) |
:- | only if(ß) |
not | not(¬) |
likes(kim,X),likes(lee,X).
likes(kim,pinky) :- likes(lee,X).
likes(kim,pinky) :- not(likes(lee,pinky)).
질문(questions)사실들을 저장한 후에는 그에 관한 질문 제기를 합니다.
질문은 사실과 유사하나 그 앞에 특수 기호 있습니다.
예제)
Does mary own the book -> ?- owns(mary,book).
규칙(rules)규칙은 다른 사실로부터 하나의 또 다른 사실을 추론 가능하게 합니다.
Prolog 인터프리터를 아래 링크에서 구했습니다.
http://www.freeprogrammingresources.com/ 전 SWI-Prolog를 설치해서 Prolog 언어를 써보았습니다.
아래 화면은 SWI-Prolog 홈페이지 화면입니다. SWI-Prolog는 무료로 다운로드를 받을 수 있습니다:D
http://www.swi-prolog.org SWI-Prolog를 설치했을때의 화면입니다.
아래 화면처럼 Prolog 언어로 만든 코드를 가지고 함수를 불러서 제대로 Prolog 언어를 구현했는지 알아 봅니다.
이번과제는 아주 난해했습니다. 일반적으로 쓰던 언어들의 구조에서 완전히 벗어난 비 절차적인 언어인 Prolog를 공부하다 보니 너무 어렵더군요 ㅋ
일반적으로 C,C++,JAVA Basic, Perl에 익숙한 저에게 이런 언어는 아주 어렵게 느껴졌습니다. 논리형 언어라는것이 언어를 영어같은 서구 언어로 만들어져서 서구 언어같이 만들어진 것 같습니다.
서구 언어 같이 논리적이지 못한 한국어로 Prolog를 이해하려니 너무나 어려웠군요. 그리고 Prolog같은 언어는 한국어로 된 책도 별로 없는데다 한국어로 된 책으로 공부하면 더더욱 이해가 안갑니다. 그래서 원서를 빌려 공부했습니다.
아래 사진은 Prolog를 공부한 원서
Prolog를 배우니까 재미있긴 한데 제 머릿속에 난해한 언어는 이게 처음인듯 합니다. Pascal이나 Perl같은 경우는 C언어를 알면 금방 배우게 된다면 Prolog같은 언어는 함수를 만드는게 너무나 힘들었다는 ㅠㅠ
아래는 제가 Test해서 된 결과입니다.
실행결과
Welcome to SWI-Prolog (Multi-threaded, Version 5.6.34)
Copyright (c) 1990-2007 University of Amsterdam.
SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to redistribute it under certain conditions.
Please visit http://www.swi-prolog.org for details.
For help, use ?- help(Topic). or ?- apropos(Word).
1 ?- tree([95,218,124,84,90,94,79,73,68,65,70,88], Tree).
==========================================================
Binary Tree Programming
3 A511151
==========================================================
Tree = bt(bt(bt(bt(bt(bt(nil, 65, nil), 68, bt(nil, 70, nil)), 73, nil), 79, nil),
84, bt(bt(nil, 88, nil), 90, bt(nil, 94, nil))), 95, bt(bt(nil, 124, nil), 218, nil))
Yes
2 ?- fibonacci(5).
=======================================================
Fibonacci Sequence Algorithm
3 A511151
=======================================================
Input the number : 5
0 1 1 2 3 5
Yes
3 ?- quicksort([0,56,19,80,58,47,35,89,82,74,17,85],SortedLst).
==========================================================
Quick Sort Algorithm
3 A511151
==========================================================
Sorted List :
SortedLst = [0, 17, 19, 35, 47, 56, 58, 74, 80|...] [write]
SortedLst = [0, 17, 19, 35, 47, 56, 58, 74, 80, 82, 85, 89]
Yes
4 ?- path(1,10,Path,Cost).
=======================================================
Dijkstra`s Algorithm - (Shortest Paths)
3 A511151
=======================================================
Path = [1, 2, 6, 9, 7, 10],
Cost = 9
Yes
5 ?- hanoi(3).
=======================================================
The tower of Hanoi Algorithm
3 A511151
=======================================================
Input board number : 3
board 1[1->3]
board 2[1->2]
board 1[3->2]
board 3[1->3]
board 1[2->1]
board 2[2->3]
board 1[1->3]
Yes
6 ?-