우리는 사실, 동일한 입력에 대해서 동일한 출력을 내어주는 기계에 더 익숙합니다. 계산기에 수를 넣고, 프로그램에 데이터를 넘기며, 정해진 조건에 따라 결과가 나올 것을 기대합니다. 결과가 예상과 다르면 입력과 처리 과정을 살펴봅니다. 무엇을 넣었고 어떤 연산을 거쳤는지 알 수 있다는 점이 기계를 신뢰하는 근거가 됩니다.

이 익숙한 계산의 관점에서 보면, ‘추론하는 기계’는 사실과 규칙을 입력받아 그로부터 따라오는 결론을 출력하는 기계입니다. 이때는 계산 방법과 함께, 입력한 사실과 규칙이 무엇을 뜻하는지 정해야 합니다. 어떤 대상을 한 종류에 속한다고 기록했을 때 다른 어떤 분류가 따라오는지, 두 개념 사이의 관계를 받아들이면 무엇을 더 알 수 있는지까지 명시하는 것입니다.

시맨틱 리즈닝(Semantic Reasoning)도 여기서 출발합니다. 먼저 개념의 뜻과 개념 사이의 관계를 정합니다. 그런 다음, 이미 알고 있는 사실에서 논리적으로 어떤 결론이 따라오는지 알아냅니다. 이 글에서는 지식 표현과 시맨틱 웹 분야에서 쓰는 의미를 살펴보겠습니다. 설명의 바탕은 W3C의 RDF 1.1 Semantics와 OWL 2 Primer입니다.

여기서 ‘의미’란 기계가 단어를 보고 사람과 같은 심상을 떠올린다는 뜻이 아닙니다. TemperatureSensor라는 기호가 어떤 대상을 가리키며, 다른 개념과 어떤 관계를 맺고, 어떤 문장이 참이 되려면 무엇이 성립해야 하는지를 정한다는 뜻입니다. 이름을 붙이는 일과 그 이름이 요구하는 결과를 계산하는 일이 연결됩니다.

앞서 쓴 시맨틱 태깅에 관한 글이 기록을 개념과 개체에 연결하는 문제를 다루었다면, 여기서는 그 연결을 받아들였을 때 어떤 결론까지 받아들여야 하는지를 묻습니다.

‘논리적으로 따라온다’는 말은 생각보다 엄격합니다. 지식 기반을 K, 확인하려는 문장을 q라고 할 때, K ⊨ q는 K를 참으로 만드는 모든 허용된 해석에서 q도 참이라는 뜻입니다. 이런 관계를 논리적 함의(entailment)라고 합니다. ‘해석’은 기호와 관계가 무엇을 뜻하는지 정한 하나의 방식이고, K를 만족하는 해석을 K의 모델이라고 부릅니다. 어떤 한 해석에서 그럴듯하다는 것으로는 충분하지 않습니다. 전제가 성립하면서 결론만 거짓이 되는 해석이 없어야 합니다. 이 설명은 RDF 의미론의 함의 정의를 지식 기반의 표기로 풀어쓴 것입니다. [1]

예를 들어 “sensor_17은 온도 센서다”라는 사실이 있다고 합시다. 여기에 “모든 온도 센서는 센서다”, “모든 센서는 장치다”를 개념의 포함 관계로 받아들이면, sensor_17을 온도 센서로 해석하면서 장치가 아니라고 해석할 수는 없습니다. 그래서 “sensor_17은 장치다”가 따라옵니다. 반면 이 정보만으로는 그 센서의 제조사나 설치 장소를 알아낼 수 없습니다.

무엇을 허용된 해석으로 삼는지도 중요합니다. RDF 그래프의 모양이 같아도 단순 RDF 의미론과 RDFS의 의미론에서는 따라오는 결론이 달라질 수 있습니다. RDFS는 클래스와 하위 클래스 같은 어휘에 추가적인 의미 조건을 부여합니다. 따라서 “이 그래프에서 추론했다”는 설명에는 어떤 의미 체계를 적용했는지도 포함되어야 합니다. [1]

온톨로지는 이런 의미 체계를 명시하는 데 쓰입니다. “이 장비는 온도 센서다”는 개별 대상에 관한 주장이고, “온도 센서는 센서의 한 종류다”는 개념 사이의 공리입니다. 추론기는 이들을 함께 고려해 새로운 분류를 알아내거나, 주어진 공리들이 서로 양립 가능한지 검사할 수 있습니다. OWL은 이러한 지식을 표현하고 추론하기 위한 언어입니다. 다만 어느 추론 작업을 지원하는지는 언어의 범위와 구현에 따라 달라집니다. [2]

의미론이 정하는 것은 무엇이 정답인가이고, 그 답을 실제로 구하는 절차는 따로 있어야 합니다. 개념 관계 가운데 규칙으로 표현할 수 있는 부분은 Datalog의 사실과 규칙으로 옮길 수 있고, 그러면 추론이 실행 가능한 프로그램이 됩니다. 다음은 앞의 센서 이야기를 wirelog 문법으로 적은 작은 예제입니다.

.decl known_type(entity: symbol, category: symbol)
.decl subclass(child: symbol, parent: symbol)
.decl type(entity: symbol, category: symbol)

known_type("sensor_17", "TemperatureSensor").
subclass("TemperatureSensor", "Sensor").
subclass("Sensor", "Device").

type(X, C) :- known_type(X, C).
type(X, Parent) :- type(X, Child), subclass(Child, Parent).

첫 번째 규칙은 입력받은 분류를 type에 반영합니다. 두 번째 규칙은 어떤 대상이 한 종류에 속하고 그 종류가 더 넓은 종류에 포함되면, 그 대상도 더 넓은 종류에 속한다고 말합니다. 따라서 type 관계에는 다음 세 사실이 포함됩니다.

type("sensor_17", "TemperatureSensor")
type("sensor_17", "Sensor")
type("sensor_17", "Device")

위 결과는 PyreWire 1.1.2(wirelog 0.70.0)로 예제를 실행해 확인했습니다. [4]

subclass라는 이름에는 아무 효과가 없습니다. 효과를 만드는 것은 두 번째 규칙이고, 그 규칙을 빼면 Sensor와 Device 분류도 나오지 않습니다. 의미는 사람이 규칙으로 적고, 엔진은 그 규칙을 평가합니다.

여기서는 부정도 새 값을 끝없이 생성하는 연산도 없습니다. 유한한 입력을 바탕으로 새로운 분류를 보태다가 더 얻을 사실이 없으면 멈춥니다. 이 예제의 과정은 고정점과 온톨로지에 관한 앞선 글에서 설명한 최소 고정점 계산에 해당합니다. 규칙에 의해 따라오는 사실을 모두 반영한 폐쇄(Closure)를 구하는 한 가지 방법입니다.

wirelog가 맡는 부분은 이 계산입니다. 규칙으로 옮긴 의미 체계를 실제 서비스에서 반복해서 계산할 수 있도록 Datalog 규칙의 실행 기반을 제공합니다.

  • 사실과 규칙을 입력받아 그로부터 따라오는 결론을 계산합니다.
  • 사실이 추가되거나 삭제되면 결론을 갱신합니다. 변경된 부분만 계산하려면 별도 설정이 필요합니다.
  • 서비스나 장치의 프로그램 안에 넣어 사용할 수 있습니다. 프로그램이 사실을 전달하고 계산 결과를 받아 활용합니다.

센서 예제에서 sensor_17이 장치로 분류된 이유는 한 줄로 설명할 수 있습니다. 온도 센서는 센서에, 센서는 장치에 포함된다는 규칙을 적었기 때문입니다. 계산기를 믿는 근거가 무엇을 넣고 어떤 연산을 거쳤는지 알 수 있다는 점이었다면, 추론하는 기계도 같은 근거로 믿을 수 있습니다. 어떤 사실과 규칙을 넣었는지 보면 결론이 왜 나왔는지 알 수 있습니다. wirelog는 그 규칙을 서비스 안에서 계산하고, 사실이 바뀌면 결론을 갱신하는 일을 맡습니다.

이 글에서 다루지 않은 것

센서 예제는 하위 클래스에 따른 분류 전파만 보여 줍니다. Datalog 프로그램 하나로 OWL 전체를 구현할 수는 없습니다. W3C는 규칙 기반으로 구현하기 적합한 범위로 OWL 2 RL 프로파일과 RL/RDF 규칙을 따로 정의해 두었고, 그 질의 응답 보장도 프로파일의 제약을 지키는 구현에 해당합니다. wirelog 위에서 OWL 추론을 하려면 이 규칙을 정확히 대응시키고 검증하는 작업이 별도로 필요합니다. [3]

열린 세계 가정과 닫힌 세계 가정의 차이도 다루지 않았습니다. OWL에서는 어떤 문장을 도출하지 못했다고 그 문장이 거짓이 되지 않습니다. 센서의 위치가 기록되어 있지 않다는 것과 그 센서가 어디에도 없다는 것은 다른 주장입니다. 규칙의 폐쇄를 계산하는 일과 기록에 없는 것을 거짓으로 보는 일은 구분해야 합니다. [2]

엔진은 입력이 현실과 맞는지 판단하지 않습니다. 센서를 잘못 분류해 넣으면 그 분류에서 따라오는 결론도 그대로 계산됩니다. 결론마다 증명 경로나 자연어 설명을 내보내는 기능, 자연어에서 사실을 추출하거나 온톨로지를 설계하는 일도 이 글의 범위 밖입니다.

마무리

시맨틱 리즈닝은 개념의 뜻과 관계를 명시하고, 주어진 사실에서 그 의미에 따라 논리적으로 따라오는 결론을 도출하는 과정입니다. 온도 센서가 센서의 한 종류이고 센서가 장치의 한 종류라면, 온도 센서로 기록된 대상은 장치이기도 합니다. 이처럼 따로 기록하지 않은 분류나 관계를 이미 주어진 지식으로부터 알아내는 것이 시맨틱 리즈닝입니다.

사람은 개념과 관계의 의미를 정하고, 기계는 그 의미에 따라 성립하는 결론을 계산합니다. 이 글의 예제에서는 개념의 포함 관계를 Datalog 규칙으로 표현하고 wirelog로 계산했습니다. 처음에 살펴본 익숙한 계산이 수와 연산을 다루었다면, 여기서의 계산은 사실과 그 사실 사이에 성립하는 논리적 관계를 다룹니다.

참고문헌

모든 웹 자료의 확인일은 2026년 10월 7일입니다. 예제는 당시 PyPI 최신 배포 버전인 PyreWire 1.1.2를 macOS ARM64에 설치하고, 함께 설치된 wirelog 0.70.0으로 실행했습니다.

  1. W3C. RDF 1.1 Semantics. W3C Recommendation, 2014년 2월 25일. 특히 §3 “Semantic Extensions and Entailment Regimes”, §5.2 “Simple Entailment”, §9 “RDFS Interpretations”. 원문.
  2. W3C. OWL 2 Web Ontology Language Primer (Second Edition). W3C Recommendation, 2012년 12월 11일. 특히 §2 “What is OWL 2?”와 §3 “Modeling Knowledge: Basic Notions”. 원문.
  3. W3C. OWL 2 Web Ontology Language Profiles (Second Edition). W3C Recommendation, 2012년 12월 11일. 특히 §4 “OWL 2 RL”과 §4.3 “Reasoning in OWL 2 RL and RDF Graphs using Rules”. 원문.
  4. PyreWire contributors. PyreWire 1.1.2. PyPI 배포 페이지. 원문.