|
| 1 | +--- |
| 2 | +layout: post |
| 3 | +title: Prolog으로 살펴보는 지식 베이스의 구조 |
| 4 | +subtitle: 관계를 중심으로 지식을 표현하는 방법 |
| 5 | +parent: RAG |
| 6 | +grand_parent: AI |
| 7 | +comments: true |
| 8 | +categories: ["Programming", "RAG", "Knowledge Base"] |
| 9 | +tag: ["Knowledge Base", "Logic programming", "Prolog"] |
| 10 | +--- |
| 11 | + |
| 12 | +## 지식 베이스란 무엇인가 |
| 13 | + |
| 14 | +데이터베이스는 보통 “값(value)”을 저장하고 관리하기 위한 구조다. 하지만 현실의 많은 문제는 단순히 데이터를 개별적으로 다루는 것 보다, 데이터의 대상 간의 관계와 의미를 표현하는 것이 더 중요하다. |
| 15 | + |
| 16 | +예를 들어 “CPU는 메인보드의 일부이다”, “메인보드는 컴퓨터의 일부이다”라는 정보는 데이터라기보다 지식(knowledge) — 즉, 관계로 이루어진 사실이다. |
| 17 | + |
| 18 | +이렇게 사실(facts)과 관계(rules)를 체계적으로 표현해두고, 시스템이 그 관계를 기반으로 새로운 결론을 추론(inference) 할 수 있도록 만든 구조가 바로 `지식 베이스(Knowledge Base)`이다. |
| 19 | + |
| 20 | +## Prolog의 기본 문법 요약 |
| 21 | + |
| 22 | +`Prolog`는 이런 지식 구조를 기술하기에 적합한 Logic programming 패러다임을 기반으로 하는 언어이다. 절차를 명령하는 대신, 무엇이 참인가를 선언하는 방식으로 동작한다. 이 글에서는 지식 구조를 표현하기위해 `Prolog`를 활용하고, 최대한 간단하게 문법 구조를 설명한다. |
| 23 | + |
| 24 | +`Prolog`의 핵심 구성 요소는 세 가지다: |
| 25 | + |
| 26 | +1. `사실(Fact)`: “A는 B의 일부이다.” 같은 참인 문장 |
| 27 | + |
| 28 | +2. `규칙(Rule)`: “A가 B의 일부이거나, B가 C의 일부이면 A는 C의 일부이다.” 같은 논리적 정의 |
| 29 | + |
| 30 | +3. `질의(Query)`: “CPU는 컴퓨터의 일부인가?” 같은 질문 |
| 31 | + |
| 32 | +예를 들어 문법은 다음처럼 간단하다. |
| 33 | + |
| 34 | +```prolog |
| 35 | +fact. % 사실 |
| 36 | +rule :- condition. % 규칙 |
| 37 | +?- query. % 질의 |
| 38 | +``` |
| 39 | + |
| 40 | +이 구조를 통해 `Prolog`는 데이터가 아닌 논리적 관계를 저장하고 추론한다. |
| 41 | + |
| 42 | +## 예제: 컴퓨터 부품을 이용한 지식 베이스 |
| 43 | + |
| 44 | +이재 지식 베이스를 이해하기 위해 예제로 컴퓨터의 구성 관계를 Prolog 문법을 활용해서 표현해보려고 한다. |
| 45 | + |
| 46 | +### 사실 정의 |
| 47 | + |
| 48 | +먼저 각 부품이 어떤 구성 요소에 속하는지를 사실로 정의한다. |
| 49 | + |
| 50 | +```prolog |
| 51 | +% 상위 구조 |
| 52 | +part_of(motherboard, computer). |
| 53 | +part_of(power_supply, computer). |
| 54 | +part_of(storage, computer). |
| 55 | +part_of(case, computer). |
| 56 | +part_of(peripheral, computer). |
| 57 | +
|
| 58 | +% 메인보드 구성 |
| 59 | +part_of(cpu, motherboard). |
| 60 | +part_of(memory, motherboard). |
| 61 | +part_of(gpu, motherboard). |
| 62 | +part_of(chipset, motherboard). |
| 63 | +
|
| 64 | +% CPU 내부 구성 |
| 65 | +part_of(core, cpu). |
| 66 | +part_of(cache, cpu). |
| 67 | +part_of(alu, cpu). |
| 68 | +part_of(control_unit, cpu). |
| 69 | +
|
| 70 | +% 저장 장치 구성 |
| 71 | +part_of(hard_disk, storage). |
| 72 | +part_of(ssd, storage). |
| 73 | +
|
| 74 | +% 주변 장치 구성 |
| 75 | +part_of(keyboard, peripheral). |
| 76 | +part_of(mouse, peripheral). |
| 77 | +part_of(monitor, peripheral). |
| 78 | +part_of(speaker, peripheral). |
| 79 | +``` |
| 80 | + |
| 81 | +이것은 “CPU는 메인보드의 일부이다”, “메인보드는 컴퓨터의 일부이다”와 같은 기초 지식*이다. |
| 82 | + |
| 83 | +### 규칙 정의 |
| 84 | + |
| 85 | +이제 이 관계를 바탕으로 더 넓은 의미의 포함 관계를 추론하는 규칙을 정의할 수 있다. |
| 86 | + |
| 87 | +```prolog |
| 88 | +is_part_of(X, Y) :- part_of(X, Y). |
| 89 | +is_part_of(X, Y) :- part_of(X, Z), is_part_of(Z, Y). |
| 90 | +``` |
| 91 | + |
| 92 | +이 규칙은 |
| 93 | + |
| 94 | +* X가 Y의 직접적인 부품이면 참이다. |
| 95 | +* X가 Z의 부품이고, Z가 Y의 일부라면, X도 Y의 일부로 본다. |
| 96 | + |
| 97 | +즉, 계층적인 관계를 재귀적으로 추론하도록 만든 것이다. |
| 98 | + |
| 99 | +### 질의 수행 |
| 100 | + |
| 101 | +이제 시스템에 질문을 던져보자. |
| 102 | + |
| 103 | +```prolog |
| 104 | +?- is_part_of(cpu, computer). |
| 105 | +``` |
| 106 | + |
| 107 | +Prolog는 다음과 같은 과정을 통해 결과를 찾아낸다. |
| 108 | + |
| 109 | +```plaintext |
| 110 | +alu → cpu → motherboard → computer |
| 111 | +``` |
| 112 | + |
| 113 | +결과: `true.` |
| 114 | + |
| 115 | +또는 컴퓨터에 포함된 모든 부품을 물을 수도 있다. |
| 116 | + |
| 117 | +```prolog |
| 118 | +?- is_part_of(X, computer). |
| 119 | +``` |
| 120 | + |
| 121 | +출력: |
| 122 | + |
| 123 | +```plaintext |
| 124 | +X = motherboard ; |
| 125 | +X = cpu ; |
| 126 | +X = memory ; |
| 127 | +X = gpu ; |
| 128 | +X = chipset ; |
| 129 | +X = core ; |
| 130 | +X = cache ; |
| 131 | +X = alu ; |
| 132 | +X = control_unit ; |
| 133 | +X = power_supply ; |
| 134 | +X = storage ; |
| 135 | +X = hard_disk ; |
| 136 | +X = ssd ; |
| 137 | +X = case ; |
| 138 | +X = peripheral ; |
| 139 | +X = keyboard ; |
| 140 | +X = mouse ; |
| 141 | +X = monitor ; |
| 142 | +X = speaker. |
| 143 | +``` |
| 144 | + |
| 145 | +이 결과는 지식 베이스가 단순한 데이터 저장소가 아니라, 관계 정의만으로 논리적 전체 구조를 스스로 탐색하는 시스템임을 보여준다. |
| 146 | + |
| 147 | +## 결론 |
| 148 | + |
| 149 | +이 간단한 예제는 지식 베이스의 핵심 구조를 이해하기 위해 작성했따. 지식 베이스는 데이터를 나열하는 것이 아니라, 데이터로 표현되는 사물 간의 관계를 정의하고 그 관계를 통해 새로운 사실(fact)을 추론하는 시스템이다. |
| 150 | + |
| 151 | +Prolog는 이러한 구조를 가장 단순하고 명확한 형태로 표현할 수 있게 해준다. 즉, “무엇을 할 것인가”가 아니라 “무엇이 참인가”를 선언하고, 그로부터 시스템이 스스로 답을 찾아내는 방식을 실험할 수 있는 언어다. 이 언어의 문법을 이용해 사실을 나열하고 규칙을 정의한 뒤 질의를 통해 지식을 인출하는 방식을 표현했다. |
| 152 | + |
| 153 | +이것이 지식 베이스의 본질이며, 오늘날의 인공지능이 다루는 지식 표현(knowledge representation)의 출발점이다. |
0 commit comments