《 인공지능 분야에서 사용하는 논리형 고급 프로그래밍 언어. 》

  • 1973년 프랑스 마르세유 대학교의 컴퓨터 과학자 알랭 콜메르(Alan Colmerauer)와 논리학자 P. 루셀이 개발한 언어로서, 논리식을 토대로 하여 오브젝트와 오브젝트 간의 관계에 관한 문제를 해결하기 위해 사용합니다.

  • 영어 단어로 표현되는 사실(fact)과 규칙(rule)으로 프로그램을 표현하며, 논리학에서의 1차 서술 논리의 규칙을 그대로 따르고 있습니다. 주로 숫자 계산보다는 인공 지능 분야에서의 논리적인 추론이나 패턴 매칭, 리스트 처리 등에 적합합니다.

  • 프롤로그(PROLOG)는 술어 논리식을 프로그램, 증명하는 것을 계산한다는 것으로 간주하는 관점에서 새로운 계산의 기술형태를 취하고 있습니다. 즉, 프로그램 자체는 논리식의 모양으로 만들어지고, 그 프로그램을 실행하는 처리계가 그 증명기로 되어 있습니다.
  • 코볼(COBOL), 포트란(FORTRAN), C 등의 절차형 언어에 대하여 논리형 언어입니다. 추론 기구를 간결하게 표현할 수 있기 때문에 인공지능 분야에서 사용하는 기본 언어입니다.

  • 프롤로그(PROLOG)는 LISP(List Processing)보다는 규모가 작기 때문에 PC를 비롯한 여러 종류의 컴퓨터에서 실행이 가능합니다. 프롤로그는 전문가 시스템의 연구에는 기여를 해왔으나, 대형 전문가 시스템 개발에는 적합하지 못합니다. 그러나 병렬 탐색에 적합하게 설계되어 있기 때문에 병렬 처리가 주요 요소가 될 미래의 컴퓨터에 적합한 언어로 여겨지고 있습니다.





프로그램 흐름도

  • 다음과 같은 전체적인 큰 흐름을 통해서 프로그램이 진행되며, 최적의 해를 찾아냅니다.

[설명1] * 사용자로부터 ‘출발지’, ‘여행 시작 시간 정보’, ‘여행 종료 시간 정보’, ‘예상 비용’, ‘여행지(도착지)’ 에 대한 정보를 입력 받습니다.

[설명2] * 복수, 단일 여행지에 따른 여행지 리스트 구성

  • 여행지로 출발하기 위한 출발 비행기 편을 설정하고, 재귀 호출을 통해, 최적의 패키지 리스트를 추출하는 작업을 시작합니다.

[설명3] * 올바른 이벤트를 추출하여 리스트로 구성 (여행 목적지에서 발생하는 이벤트만 포함). 그리고 시작 시간 순으로 정렬.

  • 유효하지 않은 이벤트 제외 (제외 되는 이벤트 예: ①시간
    데이터가 올바르지 않은 이벤트, ②여행 시간 내에 포함되지않은 이벤트, ③예상 비용을 초과하는 이벤트)

[설명4] * 비행기 출발 시각이 유효한 경우만 추출하여 리스트로 구성. 처음 여행지에 대한 출국 비행기편(복수 여행지일 경우, 다음 여행지)에 대해 구성합니다..
(비행기 출발 시각은 여행 시작 시각 보다 이후이어야 하며,
또한, 여행 종료 시각 보다 이전이어야 합니다. 그리고 여행
비용을 초과 하지 않아야 합니다)

[설명5] * 여행 기간 중에 유효한 호텔만을 추출하여 리스트로 구성합니다. 여기서 유효한 호텔이란, 현재 여행지(복수 여행지의 경우 체크)에서의 체류 기간 동안에 투숙이 가능한 호텔을 말합니다.
또한, 여행 비용을 초과하지 않는지 검사합니다.

[설명7] * 체류하고 있는 여행지에서 체류하는 기간동안에 가능한 모든 이벤트 조합 목록을 생성합니다. 그러나 이벤트 시간이 겹치는 이벤트 조합이나, 예상 비용을 초과하는 이벤트
조합은 제외됩니다.

[설명8] * 위의 (6)번 과정에서 유효한 이벤트 조합 목록을 찾아내었는데, 그 중에서 가장 최적의 조합을 찾아냅니다. 즉, 남은 비용과 낭비된 시간을 합한 스코어가 가장 작은 이벤트 조합을 찾아냅니다.

[설명9] * (3) ~ (8) 번까지의 과정은 단일 여행지에 대한 최적화 패키지를 구성하는 작업입니다. 그러므로 (3) ~ (8) 번의 과정을 재귀적으로 다시 호출, 처리하면 복수 여행지의 경우에 대한 모든 최적화 패키지를 구성 할 수 있습니다. 즉, 다음 여행지에 대한 최적화 패키지 구성을 위해 (3) ~ (8) 과정을 새
로운 여행지에 적용합니다.

[설명10] * (3) ~ (9) 번 과정을 통해서 찾아낸 패키지 조합을 통해서 최적의 패키지 구성을 찾아냅니다.
최적의 패키지를 찾아내면 해당 되는 결과 정보를 화면에 출력합니다.

  • 다음 다이어그램(관계도)은 각 Predicate 간의 호출 관계를 나타냅니다.
  • 화살표가 향하는 부분의 Predicate이 호출되는 것이며, 자기 자신에게 화살표가 되돌아가는 경우는 재귀적인 호출임을 말합니다.
  • 각 상태(State)의 이름은 프로그램 내에서 사용되는 Predicate 이름이며, 화살표는 호출 관계를 나타냅니다.
  • 각 Predicate에 관한 설명은 4-2)절, 또는 소스 코드 내용을 참조하세요.