Datalog나 Prolog 같은 논리 프로그래밍 언어를 이야기하다 보면, 자연스럽게 “이건 데이터가 아니라 사실(fact)과 규칙(rule)으로 이루어져 있다”고 말하게 됩니다. 그런데 생각해보면 표에 들어있는 값이나 그래프에 들어있는 노드나 똑같은 ‘데이터’로 보일 수 있습니다. 그럼에도 굳이 ‘사실’이라는 다른 단어를 가져와서 쓰는 데에는 시스템의 전제와 관련된 분명한 이유가 있습니다. 이 작은 단어의 차이는 궁극적으로 시스템이 단순한 ‘조회’를 넘어 ‘추론(Inference)’과 ‘추리(Reasoning)’로 나아가기 위한 출발점이 됩니다.

데이터(Data)와 사실(Fact)의 미묘한 차이

우리가 보통 ‘데이터’라고 부를 때는 구조나 그릇을 먼저 떠올립니다. 관계형 데이터베이스(RDB)에서는 테이블의 행(row) 하나가 데이터입니다. student 테이블에 (1, '홍길동', '컴퓨터공학')이라는 레코드가 들어있다고 해보죠. 이 자체로는 그냥 값의 묶음입니다. 이 값이 무슨 의미인지는 테이블의 스키마와 애플리케이션의 로직이 알고 있습니다. 테이블이나 구조 밖으로 꺼내면 데이터는 의미를 잃기 쉽습니다. (1, '홍길동', '컴퓨터공학')만 떼어놓고 보면 이것이 학생 정보인지, 교수 정보인지, 동명이인인지 알기 어렵습니다.

반면 ‘사실(Fact)’은 명제(proposition)입니다. 참(true)이라고 선언된 완결된 문장에 가깝습니다. Datalog에서 이를 표현하면 student(1, "홍길동", "컴퓨터공학").이 됩니다. 이 문장은 그 자체로 하나의 주장을 담고 있습니다. 술어(predicate)인 student가 정보의 맥락을 감싸고 있기 때문입니다.

이 둘은 겉보기엔 비슷해 보이지만, 시스템이 이를 다루는 전제가 다릅니다. 데이터베이스에서 레코드는 “저장된 정보”이지만, Datalog에서 fact는 “참으로 알려진 명제”입니다.

사실에서 출발하는 기계적 도출: 추론(Inference)

‘사실(Fact)’이라는 명제가 준비되면, 시스템은 이를 바탕으로 연산을 시작할 수 있습니다. 여기서 등장하는 것이 ‘규칙(Rule)’입니다. 사실과 규칙이 만나면 시스템은 ‘추론(Inference)’을 수행합니다.

데이터베이스에서는 쿼리를 통해 데이터를 ‘조회’하거나 필터링합니다. 하지만 논리 프로그래밍 시스템은 규칙이라는 논리적 뼈대 위에서 기존의 사실들을 결합해 ‘새로운 사실’을 기계적으로 만들어냅니다.

engineering_student(Name) :- student(ID, Name, "컴퓨터공학").

이 규칙은 “어떤 ID와 Name을 가진 사람이 컴퓨터공학 student라는 사실이 참이라면, 그 Name은 engineering_student라는 사실 또한 참이다”라는 선언입니다. Datalog 엔진(추론기, Inference Engine)은 이 규칙을 기존 사실들에 적용하여, 데이터베이스에는 명시적으로 저장되어 있지 않던 engineering_student("홍길동").이라는 새로운 사실을 연역해 냅니다.

추론(Inference)은 수학적이고 기계적인 과정입니다. 주어진 전제(사실)와 논리적 규칙(룰)에 어긋남 없이, 참이라고 보장할 수 있는 새로운 명제들을 바닥부터 쌓아 올리는 작업입니다. 필터링이 아니라 도출(derivation)에 가깝습니다.

추론(Inference)을 넘어선 추리(Reasoning)

그렇다면 추론(Inference)이 모이면 무엇이 될까요? 우리는 종종 추론을 넘어 ‘추리(Reasoning)’라는 단어를 마주하게 됩니다. 두 단어는 혼용되기도 하지만, 인공지능과 지식 표현의 관점에서 보면 그 층위가 조금 다릅니다.

추론(Inference)이 규칙을 적용해 명제를 하나하나 연역해 내는 미시적이고 기계적인 ‘과정(Process)’이라면, 추리(Reasoning)는 그러한 추론들을 엮어서 복잡한 문제를 해결하거나 결론에 도달하는 거시적인 ‘행위(Activity)’에 가깝습니다.

예를 들어, “홍길동은 어느 캠퍼스에서 수업을 듣는가?”라는 질문에 답하기 위해 시스템은 여러 단계의 도약을 거쳐야 합니다.

  1. 홍길동이 컴퓨터공학 학생이라는 사실을 찾습니다.
  2. 컴퓨터공학 학생은 공과대학 소속이라는 규칙을 적용해 새로운 사실을 추론합니다.
  3. 공과대학 소속 학과는 제2캠퍼스를 사용한다는 사실과 결합합니다.
  4. 이 모든 기계적 추론(Inference)의 사슬을 엮어, 최종적으로 “홍길동은 제2캠퍼스에서 수업을 듣는다”는 결론을 냅니다.

이 전체의 과정, 즉 목적을 가지고 여러 논리적 도출 단계를 설계하고 연결하여 해답을 찾아내는 행위 자체가 바로 추리(Reasoning)입니다. 단순히 A에서 B가 나온다는 기계적 단계를 넘어, 맥락을 이해하고 여러 사실과 규칙 사이의 경로를 탐색하는 인지적 성격을 띠게 됩니다.

추론과 추리가 층위를 가진 것일까?

앞서 추론과 추리의 층위가 다르다고 언급했지만, 과연 이 둘 사이에 명확한 상하 관계나 층위가 존재하는지는 다시 생각해 볼 문제입니다. 이 차이를 명확히 보기 위해 Datalog 코드 두 개를 비교해 보겠습니다.

먼저 전형적인 추론(Inference)의 예제입니다.

% 사실 (Fact)
parent("영희", "철수").
parent("철수", "민수").

% 규칙 (Rule)
grandparent(X, Y) :- parent(X, Z), parent(Z, Y).

엔진은 단순히 조부모 규칙에 맞춰 grandparent("영희", "민수").라는 새로운 사실을 기계적으로 도출합니다. 이것은 주어진 명제와 규칙에 따른 가장 기초적인 연역 과정입니다. Datalog 엔진의 관점에서 보면, 시스템 내부에는 목적 의식이나 거시적인 방향성이 존재하지 않으며 오직 규칙에 따른 이러한 평면적인 연산(Inference)만이 일어납니다.

반면, 이 시스템을 설계하고 질문을 던지는 사람의 관점이 개입되면 이것은 추리(Reasoning)의 영역으로 넘어갑니다. “사내망에서 발생한 보안 규정 위반자를 찾아라”라는 목적을 가진 다음의 예제를 보시죠.

% 사실 (Fact)
employee("홍길동", "개발팀").
access_log("홍길동", "보안서버A", "2026-06-01").
policy("보안서버A", "보안팀").

% 규칙 (Rule): 단계별 논리 설계
% 1. 인가된 접근 권한 정의
authorized_access(Person, Server) :- 
    employee(Person, Dept), 
    policy(Server, Dept).

% 2. 보안 위반 탐지
security_violation(Person, Server, Date) :- 
    access_log(Person, Server, Date), 
    not authorized_access(Person, Server).

엔진 입장에서는 이전 예제와 똑같이 주어진 규칙(authorized_accesssecurity_violation)을 기계적으로 순차 적용하여 security_violation("홍길동", "보안서버A", "2026-06-01").이라는 사실을 하나 더 만들어냈을 뿐입니다.

하지만 사람의 눈으로 보면 이야기가 다릅니다. 직원 정보, 서버 정책, 접속 로그라는 각기 다른 맥락의 사실들을 엮고, ‘권한 확인’과 ‘위반 탐지’라는 다단계 논리 경로를 설계하여 “홍길동이 보안을 위반했다”는 해답에 도달했습니다. 이것은 거시적 목적을 가진 추리(Reasoning)입니다.

결국 추론과 추리의 층위는 시스템 자체의 논리적 구조라기보다, 그것을 바라보는 ‘관점의 차이’에서 비롯됩니다. 밑바닥에서 연산이 돌아가는 기계의 눈으로 보면 모든 것이 동등한 추론(Inference)이지만, 질문을 던지고 해답을 해석하는 사람의 눈으로 보면 그것은 목적을 가진 추리(Reasoning)로 묶입니다. 단순한 연역 엔진이 지식 표현(Knowledge Representation)의 강력한 도구가 되는 이유는, 이 평면적인 연산 과정에 인간이 의미와 맥락을 부여해 입체적인 추리의 과정으로 이끌어낼 수 있기 때문입니다.

추론과 추리의 구조적 차이

닫힌 데이터에서 열린 지식으로

단순히 값을 기록하고 꺼내보는 것이 목적이라면 ‘데이터’라는 이름으로도 충분했을 것입니다. 데이터 대신 굳이 ‘사실(Fact)’이라는 단어를 밑바탕에 두는 것은, 이 시스템의 목적지가 단순한 조회(Query)가 아니라 지식의 확장(Reasoning)에 있기 때문입니다.

참거짓을 판별할 수 있는 명제들을 선언하고(Fact), 그 명제들을 규칙(Rule)으로 엮어 새로운 명제를 기계적으로 도출하며(Inference), 마침내 복잡한 문제의 해답을 찾아가는 과정(Reasoning). 표의 칸을 채우는 데이터 관리(Data Management)의 관점을 벗어나, 사실에서 출발해 논리를 전개하는 지식 표현(Knowledge Representation)의 세계관이 이 작은 용어 차이에 담겨 있습니다.


관련 글