논리형 프로그래밍
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
논리형 프로그래밍은 1930년대 람다 대수를 기반으로 시작되어, 1972년 알랭 콜머로에와 로버트 코왈스키가 혼 절의 절차적 해석을 기반으로 프롤로그를 개발하면서 본격적으로 발전했다. 논리형 프로그래밍은 로직과 제어를 결합하여 알고리즘을 구성하며, 문제 해결, 실패에 의한 부정, 지식 표현 등 다양한 특징을 갖는다. 특히, 선언적 지식과 절차적 지식을 혼합하여 표현하는 데 강점을 보인다. 병행 논리 프로그래밍, 제약 논리 프로그래밍, 고차 논리 프로그래밍, 함수 논리 프로그래밍, 객체 지향 논리 프로그래밍 등 다양한 파생 분야가 있으며, 전문가 시스템, 자동 정리 증명, 자연어 처리 등 인공지능 분야에 널리 적용된다.
1930년대 앨론조 처치가 개발한 람다 대수는 논리형 프로그래밍의 기반이 되었다.[3] 1958년 존 매카시는 "Advice taker"라는 상식 추론 엔진에 대한 아이디어를 제시했다.[80]
논리형 프로그램은 프로그래밍, 데이터베이스, 지식 표현 및 문제 해결 분야에서 다양한 의미론, 문제 해결 방법, 그리고 광범위한 응용 분야를 가지고 있다.
2. 역사
존 매카시는 더 나아가 이를 보충했는데, 이것은 최초의 인공 지능 가설과 같다.
1960년대에 코델 그린은 절 형태의 논리를 사용하여 LISP에서 프로그램 실행을 시뮬레이션하는 방법을 제안했다.[3] 1967년 애버딘 대학교에서 개발된 Absys는 방정식과 람다 대수의 조합을 사용한 초기 논리형 프로그래밍 언어로 알려져 있다.[4]
1960년대 후반과 1970년대 초반, 인공지능 분야에서는 지식을 선언적으로 표현할 것인지, 절차적으로 표현할 것인지에 대한 논쟁이 있었다.[5] 스탠퍼드 대학교의 존 매카시, 버트람 라파엘, 코델 그린과 에든버러 대학교의 존 앨런 로빈슨(시라큐스 대학교 객원 학자), 패트릭 J. 헤이즈, 로버트 코왈스키는 선언적 표현을 지지했다.[5] 반면, 매사추세츠 공과대학교를 중심으로 마빈 민스키와 세이무어 페퍼트는 절차적 표현을 지지했다.[5]
1965년경, 스탠퍼드 대학교의 코델 그린이 절 형식(clausal form)의 프로그램과 그 도출 원리를 고안했다. 이는 존 앨런 로빈슨의 명제 논리의 단일화의 연역법을 참고했다.
1969년, 칼 휴잇이 설계한 플래너는 목표(즉, 목표 축소 또는 후진 사슬)와 단언(즉, 전진 사슬)으로부터 절차적 계획의 패턴 지향 호출을 특징으로 하는 논리형 프로그래밍 언어였다.[5] 매사추세츠 공과대학교에서 개발된 Planner는 당시 메인 프레임을 전제로 한 대규모성이었기때문에 운용할 수 있는 환경을 제한했다.[7] 1971년에는 이식성을 중시한 Planner의 하위 집합인 마이크로-플래너가 제럴드 제이 서스먼, 유진 차르니악, 테리 위노그래드에 의해 개발되었으며,[7] 위노그래드는 SHRDLU와 같은 자연어 이해 프로그램에 마이크로 플래너를 사용했다.[7]
플래너는 효율성을 위해 한 번에 하나의 가능한 계산 경로만 저장해야 하는 백트래킹 제어 구조를 사용했다.[7] 플래너는 이후 QA4,[8] Popler,[9] Conniver,[10] QLISP,[11] 및 동시 언어 Ether[12] 등의 언어 개발에 영향을 미쳤다.
1972년 알랭 콜머로에는 로버트 코왈스키와의 협력을 통해 혼 절의 절차적 해석을 기반으로 Prolog를 개발했다.[80] Prolog에 대한 의견은 분분했고, 칼 휴잇 등은 Micro-Planner의 복제품이라고 말했으며, 코왈스키는 논리형 프로그래밍에 대한 좋은 접근 방식이라고 평가했다. 콜머로에의 원조 버전은 "Marseille Prolog"라고 불린다. 코왈스키의 제자 데이비드 H. D. 워렌의 에든버러 대학교 개발 버전은 "Edinburgh Prolog"라고 불리며, 그 계보의 1977년 개발 버전 "DEC-10 Prolog"가 Prolog의 표준 형식이 되었다.[17] 실험을 통해 에든버러 프롤로그가 Lisp과 같은 다른 기호 프로그래밍 언어의 처리 속도와 경쟁할 수 있다는 것이 입증되었다. 에든버러 Prolog는 "사실상" 표준이 되었으며 ISO 표준 Prolog의 정의에 큰 영향을 미쳤다.
1980년대에 일본 통상산업성이 제5세대 컴퓨터 (FGCS) 프로젝트를 위한 소프트웨어를 개발하기 위해 Prolog를 채택하면서 논리형 프로그래밍에 대한 국제적인 관심이 높아졌다.[19] FGCS 프로젝트는 논리형 프로그래밍을 사용하여 대규모 병렬 컴퓨팅에서 고급 인공지능 응용 프로그램을 개발하는 것을 목표로 했다. 이 프로젝트는 처음에 프롤로그의 사용을 탐구했지만, FGCS 컴퓨터 아키텍처에 더 가깝기 때문에 나중에 동시 논리형 프로그래밍의 사용을 채택했다.[19]
그러나 동시 논리형 프로그래밍의 약속 선택 기능은 언어의 논리적 의미론[18]과 지식 표현 및 문제 해결 응용 프로그램에 대한 적합성을 방해했다.[19] 또한 이 프로젝트에서 개발된 병렬 컴퓨터 시스템은 더 일반적인 범용 컴퓨터의 개발에서 발생하는 발전을 따라가지 못했다. 이 두 가지 문제로 인해 FGCS 프로젝트는 목표를 달성하지 못했다. 논리형 프로그래밍과 AI 모두에 대한 관심이 전 세계적으로 감소했다.[19]
대한민국에서는 1980년대 일본의 영향을 받아, 인공지능 및 전산학 분야에서 논리형 프로그래밍 연구가 활발히 진행되었다.
그동안 프롤로그의 사용을 기반으로 한 것을 포함하여 더 선언적인 논리형 프로그래밍 접근 방식은 FGCS 프로젝트와 독립적으로 계속 발전했다. 특히 프롤로그는 지식의 선언적 및 절차적 표현을 결합하기 위해 개발되었지만, 논리 프로그램의 순수하게 선언적인 해석은 연역적 데이터베이스 분야의 응용 프로그램에 초점을 맞추게 되었다. 이 분야의 연구는 1977년경에 에르베 갈레르와 잭 밍커가 툴루즈에서 논리 및 데이터베이스에 대한 워크숍을 조직했을 때 두각을 나타냈다.[20] 이 분야는 결국 ''데이터로그''로 이름이 바뀌었다.
논리 프로그램의 논리적이고 선언적인 읽기에 대한 이러한 초점은 1980년대에 제약 논리 프로그래밍의 개발과 1990년대에 답 집합 프로그래밍에 의해 더욱 탄력을 받았다. 또한 최근 프롤로그의 응용 프로그램에서 새로운 강조를 받고 있다.[21]
1986년에는 논리 프로그래밍 협회 (ALP)가 설립되었다.[22]
2. 1. 초기 역사
1930년대 앨론조 처치가 개발한 람다 대수는 논리형 프로그래밍의 기반이 되었다.[3] 1958년 존 매카시는 "Advice taker"라는 상식 추론 엔진에 대한 아이디어를 제시했다.[80]
존 매카시는 더 나아가 이를 보충했는데, 이것은 최초의 인공 지능 가설과 같다.
1960년대에 코델 그린은 절 형태의 논리를 사용하여 LISP에서 프로그램 실행을 시뮬레이션하는 방법을 제안했다.[3] 1967년 애버딘 대학교에서 개발된 Absys는 방정식과 람다 대수의 조합을 사용한 초기 논리형 프로그래밍 언어로 알려져 있다.[4]
1960년대 논리형 프로그래밍의 진전을 통해, 수리 논리에 충실한 선언적 지식과 최적화 알고리즘을 도입하는 절차적 지식 중 어느 쪽을 지향해야 하는가라는 과제가 제기되었다. 선언적 지지자는 스탠퍼드 대학교와 에든버러 대학교 중심의 존 앨런 로빈슨, 코델 그린, 버트람 라파엘, 팻 헤이즈, 로버트 코왈스키 등이었다. 절차적 지지자는 매사추세츠 공과대학교 중심의 마빈 민스키, 시모어 파페르트, 칼 휴잇, 제럴드 제이 서스먼, 테리 위노그라드, 유진 차르니악 등이었다.[5]
1969년, 칼 휴잇이 설계한 논리형 언어 Planner가 매사추세츠 공과대학교에서 개발되었다. 1971년에 이식성을 중시한 서브셋 버전 "Micro-Planner"가 제럴드 제이 서스먼과 테리 위노그래드 등에 의해 개발되었다.
1972년, 마르세유 대학교의 알랭 콜머로에 등은 로버트 코왈스키 등의 조언을 얻어 혼 절과 SLD 도출을 기반으로 한 논리형 언어 Prolog를 개발했다.
2. 2. 선언적 지식 표현과 절차적 지식 표현
1960년대 후반과 1970년대 초반, 인공지능 분야에서는 지식을 선언적으로 표현할 것인지, 절차적으로 표현할 것인지에 대한 논쟁이 있었다.[5] 스탠퍼드 대학교의 존 매카시, 버트람 라파엘, 코델 그린과 에든버러 대학교의 존 앨런 로빈슨(시라큐스 대학교 객원 학자), 패트릭 J. 헤이즈, 로버트 코왈스키는 선언적 표현을 지지했다.[5] 반면, 매사추세츠 공과대학교를 중심으로 마빈 민스키와 세이무어 페퍼트는 절차적 표현을 지지했다.[5]
1965년경, 스탠퍼드 대학교의 코델 그린이 절 형식(clausal form)의 프로그램과 그 도출 원리를 고안했다. 이는 존 앨런 로빈슨의 명제 논리의 단일화의 연역법을 참고했다.
1969년, 칼 휴잇이 설계한 논리형 언어 플래너가 매사추세츠 공과대학교에서 개발되었다. 1971년에 이식성을 중시한 서브셋 버전 "Micro-Planner"가 제럴드 제이 서스먼과 테리 위노그라드 등에 의해 개발되었다.
1972년, 마르세유 대학교의 알랭 콜머로에 등은 코왈스키 등의 조언을 얻어 혼 절과 SLD 도출을 기반으로 한 논리형 언어 Prolog를 개발했다.
2. 3. Planner의 등장
1969년, 칼 휴잇이 설계한 플래너는 목표(즉, 목표 축소 또는 후진 사슬)와 단언(즉, 전진 사슬)으로부터 절차적 계획의 패턴 지향 호출을 특징으로 하는 논리형 프로그래밍 언어였다.[5] 매사추세츠 공과대학교에서 개발된 Planner는 당시 메인 프레임을 전제로 한 대규모성이었기때문에 운용할 수 있는 환경을 제한했다.[7] 1971년에는 이식성을 중시한 Planner의 하위 집합인 마이크로-플래너가 제럴드 제이 서스먼, 유진 차르니악, 테리 위노그래드에 의해 개발되었으며,[7] 위노그래드는 SHRDLU와 같은 자연어 이해 프로그램에 마이크로 플래너를 사용했다.[7]
플래너는 효율성을 위해 한 번에 하나의 가능한 계산 경로만 저장해야 하는 백트래킹 제어 구조를 사용했다.[7] 플래너는 이후 QA4,[8] Popler,[9] Conniver,[10] QLISP,[11] 및 동시 언어 Ether[12] 등의 언어 개발에 영향을 미쳤다.
2. 4. Prolog의 등장
1972년 알랭 콜머로에는 로버트 코왈스키와의 협력을 통해 혼 절의 절차적 해석을 기반으로 Prolog를 개발했다.[80] Prolog에 대한 의견은 분분했고, 칼 휴잇 등은 Micro-Planner의 복제품이라고 말했으며, 코왈스키는 논리형 프로그래밍에 대한 좋은 접근 방식이라고 평가했다. 콜머로에의 원조 버전은 "Marseille Prolog"라고 불린다. 코왈스키의 제자 데이비드 H. D. 워렌의 에든버러 대학교 개발 버전은 "Edinburgh Prolog"라고 불리며, 그 계보의 1977년 개발 버전 "DEC-10 Prolog"가 Prolog의 표준 형식이 되었다.[17] 실험을 통해 에든버러 프롤로그가 Lisp과 같은 다른 기호 프로그래밍 언어의 처리 속도와 경쟁할 수 있다는 것이 입증되었다. 에든버러 Prolog는 "사실상" 표준이 되었으며 ISO 표준 Prolog의 정의에 큰 영향을 미쳤다.
2. 5. 1980년대 이후
1980년대에 일본 통상산업성이 제5세대 컴퓨터 (FGCS) 프로젝트를 위한 소프트웨어를 개발하기 위해 Prolog를 채택하면서 논리형 프로그래밍에 대한 국제적인 관심이 높아졌다.[19] FGCS 프로젝트는 논리형 프로그래밍을 사용하여 대규모 병렬 컴퓨팅에서 고급 인공지능 응용 프로그램을 개발하는 것을 목표로 했다. 이 프로젝트는 처음에 프롤로그의 사용을 탐구했지만, FGCS 컴퓨터 아키텍처에 더 가깝기 때문에 나중에 동시 논리형 프로그래밍의 사용을 채택했다.[19]
그러나 동시 논리형 프로그래밍의 약속 선택 기능은 언어의 논리적 의미론[18]과 지식 표현 및 문제 해결 응용 프로그램에 대한 적합성을 방해했다.[19] 또한 이 프로젝트에서 개발된 병렬 컴퓨터 시스템은 더 일반적인 범용 컴퓨터의 개발에서 발생하는 발전을 따라가지 못했다. 이 두 가지 문제로 인해 FGCS 프로젝트는 목표를 달성하지 못했다. 논리형 프로그래밍과 AI 모두에 대한 관심이 전 세계적으로 감소했다.[19]
대한민국에서는 1980년대 일본의 영향을 받아, 인공지능 및 전산학 분야에서 논리형 프로그래밍 연구가 활발히 진행되었다.
그동안 프롤로그의 사용을 기반으로 한 것을 포함하여 더 선언적인 논리형 프로그래밍 접근 방식은 FGCS 프로젝트와 독립적으로 계속 발전했다. 특히 프롤로그는 지식의 선언적 및 절차적 표현을 결합하기 위해 개발되었지만, 논리 프로그램의 순수하게 선언적인 해석은 연역적 데이터베이스 분야의 응용 프로그램에 초점을 맞추게 되었다. 이 분야의 연구는 1977년경에 에르베 갈레르와 잭 밍커가 툴루즈에서 논리 및 데이터베이스에 대한 워크숍을 조직했을 때 두각을 나타냈다.[20] 이 분야는 결국 ''데이터로그''로 이름이 바뀌었다.
논리 프로그램의 논리적이고 선언적인 읽기에 대한 이러한 초점은 1980년대에 제약 논리 프로그래밍의 개발과 1990년대에 답 집합 프로그래밍에 의해 더욱 탄력을 받았다. 또한 최근 프롤로그의 응용 프로그램에서 새로운 강조를 받고 있다.[21]
1986년에는 논리 프로그래밍 협회 (ALP)가 설립되었다.[22]
3. 특징
==== 논리와 제어 ====
논리형 프로그래밍에서 알고리즘은 "로직(논리) + 컨트롤(제어)"로 구성된다. 로직은 수리 논리학의 논리식 형태로 표현되며, 프로그램은 사실과 논리 함의를 주체로 하는 규칙의 집합으로 나타난다. 컨트롤은 주어진 문제 조건에 대해 특정 골(목표)을 기점으로 해결 조건을 도출하는 과정이다.
혼 절 형식 논리 프로그램의 선언적 의미론에는 논리적 귀결 의미론과 만족 가능성 의미론 두가지 접근 방식이 있다. 논리적 귀결 의미론은 목표 해결을 프로그램의 모든 모델에서 참인 정리를 증명하는 것으로 이해하며, 정리 증명은 일차 논리로 수행된다. 후진 추론과 하이퍼 해상도와 같은 전진 추론은 정확하고 완전한 정리 증명 방법이다. 만족 가능성 의미론은 목표 해결을 프로그램의 의도된 모델에서 목표가 참임을 보이는 것으로 이해하며, 혼 형식 프로그램의 경우 항상 고유한 최소 모델이 존재한다.
최소 모델은 모델에서 참인 모든 변수 없는 사실의 집합으로 간주될 때, 프로그램의 모델이기도 한 사실의 더 작은 집합을 포함하지 않는 모델이다. 만족 가능성 의미론은 프로그램 규칙을 사용하여 기존 사실로부터 새로운 사실을 추론하는 함수의 최소 고정점으로 특징지을 수도 있다.
승계 산술에서 덧셈과 곱셈의 정의를 통해 두 의미론의 차이를 확인할 수 있다. 두 의미론 모두 덧셈 및 곱셈 목표의 동일한 존재적으로 정량화된 결합에 대해 동일한 답을 제공하지만, 논리적 귀결 의미론의 경우 비표준 모델이 존재할 수 있다. 만족 가능성 의미론에서는 유일한 표준 모델만 존재한다.
가장 널리 보급된 Prolog 계열의 논리 프로그램에서 사용되는 도출 원리는 혼 절로 표현된 로직을 더 이상 해소할 수 없는 곳까지 변형해 가는 연역과 간약이다. 컨트롤에는 SLD 도출이 사용된다.
==== 문제 해결 ====
문제 해결은 주어진 목표를 달성하기 위해 논리식을 변형해 나가는 과정이다. 혼 절은 최대 1개의 긍정 리터럴을 갖는 선언 표준형을 기반으로 하며, 명제 논리의 혼 절은 AND-OR 트리에 투영할 수 있다.
도출 원리는 주어진 사실로부터 새로운 사실을 연역하는 전향 연쇄와, 주어진 목표가 사실인지 확인하는 후향 연쇄로 나뉜다. 전향 연쇄는 주어진 사실로부터 다양한 다른 사실을 목표로 하여 해답을 구하는 연역 수법으로, 전문가 시스템 등에서 사용된다. 후향 연쇄는 주어진 목표가 사실인지 여부를 해답으로 구하는 연역 수법으로, 프롤로그 등에서 사용된다.
술어 논리의 혼 절은 AND-OR 트리의 각 노드가 명제에서 술어가 되므로 더 복잡하다. 각 노드의 술어 기호의 항은 정항과 변항으로 나뉘지만, 정항이 사실이고 변항이 단일화에 의한 사실에 묶일 수 있다면, 그 노드는 술어에서 명제가 될 수 있다.
==== 실패에 의한 부정 ====
실패에 의한 부정(Negation as failure, NAF)은 목표 증명에 실패하면 그 부정을 참으로 간주하는 추론 규칙이다.[35] 초기 프롤로그 시스템의 기능이었으며, 마이크로 플래너에도 유사한 구조가 존재했다. 프롤로그에서는 '\+' 연산자를 사용하여 구현된다.[35]
NAF의 논리적 의미는 키스 클라크에 의해 정립되었는데,[35] 그는 특정 조건 하에서 NAF가 일차 논리에서 로직 프로그램의 '완전성'을 사용하여 논리적 결과 의미론으로 추론하는 효율적이고 정확하며 (때로는 완전한) 방법임을 보였다. 완전성은 대략적으로 머리에 동일한 술어가 있는 모든 프로그램 절 집합을 "if and only if(만약 그리고 만약)"를 의미하는 iff
를 사용하여 하나의 논리식으로 간주하는 것을 의미한다. 예를 들어, 다음과 같은 프로그램 절 집합이 있을 때,
```prolog
H :- Body1.
....
H :- Bodyk.
```
이는 다음과 같은 술어의 정의로 표현된다.
```
H iff (Body1 or ... or Bodyk)
```
완전성에는 또한 통일에 해당하는 동일성 공리가 포함된다. 클라크는 SLDNF에 의해 생성된 증명이 프로그램의 완전성을 사용하여 자연 연역 스타일의 추론에 의해 생성된 증명과 구조적으로 유사함을 보여주었다.[35]
실패에의한 부정은 비단조 추론의 한 형태이며, 완전성을 보장하지는 않지만, 프로그램으로서의 완전성(completion)이라는 의미에서 건전한 추론 규칙으로 간주된다. 완전성 개념은 존 매카시의 제약 의미론[36] 및 레이 레이터의 폐쇄 세계 가정과 밀접하게 관련되어 있다.[37]
부정에 대한 완전성 의미론은 SLDNF가 증명-이론적 구현을 제공하는 논리적 결과 의미론이다. 1980년대에는 부정과 관련된 논리 프로그램에 대한 만족성 의미론이 더 인기를 얻었다. 만족성 의미론에서 부정을 논리 프로그램의 의도된 또는 표준 모델에서 진실의 고전적 정의에 따라 해석한다.
음의 조건이 있는 로직 프로그램의 경우 만족성 의미론에는 잘 정립된 의미론과 안정 모델 의미론의 두가지 변형이 있다. 잘 정립된 의미론은 수학적 논리에서 귀납적 정의 개념을 일반화하며,[38] XSB 프롤로그는 SLG 해상도를 사용하여 잘 정립된 의미론을 구현한다.[39][40] 안정 모델 의미론은 답변 집합 프로그래밍 (ASP)의 기초가 된다.
잘 정립된 의미론과 안정 모델 의미론 모두 부정이 있는 임의의 로직 프로그램에 적용된다. 그러나 두 의미론은 계층화된 로직 프로그램의 경우 일치한다.
로직 프로그래밍에서 부정을 이해하려는 시도는 추상적 인수 프레임워크의 개발에 기여했다.[41]
==== 지식 표현 ====
논리형 프로그래밍은 선언적 지식과 절차적 지식을 모두 표현하는 데 사용될 수 있다.[49] 프롤로그는 혼 절(Horn clause)과 SLD 도출, 실패에 의한 부정을 활용하여 지식을 표현하고 추론한다.
초기 논리형 프로그래밍은 절차적 지식과 전략적 정보를 표현하는 데 논리를 사용했으나, 최근에는 순전히 선언적인 지식을 표현하는 데 더 집중하고 있다. 여기에는 일반적인 상식 추론 지식과 특정 도메인 전문가 시스템의 전문 지식이 모두 포함된다.
상식 추론의 예로는 상황 계산, 사건 계산, 행동 언어 등에서 형식화된 원인과 결과에 대한 지식이 있다. 다음은 이러한 형식화의 주요 특징을 보여주는 단순화된 예시다.
```prolog
holds(Fact, Time2) :-
happens(Event, Time1),
Time2 is Time1 + 1,
initiates(Event, Fact).
holds(Fact, Time2) :-
happens(Event, Time1),
Time2 is Time1 + 1,
holds(Fact, Time1),
not(terminated(Fact, Time1)).
terminated(Fact, Time) :-
happens(Event, Time),
terminates(Event, Fact).
```holds
는 메타 술어로, 첫 번째 인수는 사실, 두 번째 인수는 시간(또는 상태)이다. holds(Fact, Time)
은 `Fact`가 `Time`에 유지됨을, happens(Event, Time)
은 `Event`가 `Time`에 발생함을 나타낸다. 시간 변화는 사실을 플루언트라고 한다.
위 절들을 사용하여 블록 세계에서 인과 관계에 대해 추론할 수 있다. 순방향 추론과 역방향 추론은 동일한 결과를 생성하지만, 순방향 추론은 플루언트를 시간 순서로, 역방향 추론은 회귀와 같이 플루언트를 '회귀적'으로 생성한다.
논리형 프로그래밍은 전문가 시스템에서 특정 도메인의 전문 지식을 표현하는 데 유용하다. 일반적인 상식과 달리, 인간의 전문 지식은 대부분 암묵지이므로 명시적 규칙으로 표현하기 어렵다. 그러나 논리 프로그램이 비즈니스 조직이나 법적 권한의 기존 명시적 규칙을 표현하는 데 사용될 때는 이러한 어려움이 발생하지 않는다.
영국 국적법의 첫 번째 문장을 단순화하여 표현하면 다음과 같다.
```prolog
initiates(birth(Person), citizen(Person, uk)):-
time_of(birth(Person), Time),
place_of(birth(Person), uk),
parent_child(Another_Person, Person),
holds(citizen(Another_Person, uk), Time).
```
1980년대에 영국 국적법의 상당 부분을 논리 프로그램으로 표현한 것은 "법률의 계산적 표현 개발에 매우 큰 영향을 미쳤다."[49] 최근에는 PROLEG 시스템이 일본 민법과 대법원 판례 규칙을 포함하여 세계에서 가장 큰 법률 규칙 기반이 되었다.
지식 표현은 선언적 지식과 절차적 지식으로 나뉜다. "하늘에서 물"에 대한 지식은 선언적으로 "비"로, 절차적으로 "우산을 쓴다" 등으로 표현된다. 논리 프로그래밍은 프롤로그의 혼 절과 후향 연쇄의 SLD 유도, 실패에 의한 부정을 이용한 비단조 논리를 통해 선언적 지식과 절차적 지식을 혼합하여 표현한다.
3. 1. 논리와 제어
논리형 프로그래밍에서 알고리즘은 "로직(논리) + 컨트롤(제어)"로 구성된다. 로직은 수리 논리학의 논리식 형태로 표현되며, 프로그램은 사실과 논리 함의를 주체로 하는 규칙의 집합으로 나타난다. 컨트롤은 주어진 문제 조건에 대해 특정 골(목표)을 기점으로 해결 조건을 도출하는 과정이다.
혼 절 형식 논리 프로그램의 선언적 의미론에는 논리적 귀결 의미론과 만족 가능성 의미론 두가지 접근 방식이 있다. 논리적 귀결 의미론은 목표 해결을 프로그램의 모든 모델에서 참인 정리를 증명하는 것으로 이해하며, 정리 증명은 일차 논리로 수행된다. 후진 추론과 하이퍼 해상도와 같은 전진 추론은 정확하고 완전한 정리 증명 방법이다. 만족 가능성 의미론은 목표 해결을 프로그램의 의도된 모델에서 목표가 참임을 보이는 것으로 이해하며, 혼 형식 프로그램의 경우 항상 고유한 최소 모델이 존재한다.
최소 모델은 모델에서 참인 모든 변수 없는 사실의 집합으로 간주될 때, 프로그램의 모델이기도 한 사실의 더 작은 집합을 포함하지 않는 모델이다. 만족 가능성 의미론은 프로그램 규칙을 사용하여 기존 사실로부터 새로운 사실을 추론하는 함수의 최소 고정점으로 특징지을 수도 있다.
승계 산술에서 덧셈과 곱셈의 정의를 통해 두 의미론의 차이를 확인할 수 있다. 두 의미론 모두 덧셈 및 곱셈 목표의 동일한 존재적으로 정량화된 결합에 대해 동일한 답을 제공하지만, 논리적 귀결 의미론의 경우 비표준 모델이 존재할 수 있다. 만족 가능성 의미론에서는 유일한 표준 모델만 존재한다.
가장 널리 보급된 Prolog 계열의 논리 프로그램에서 사용되는 도출 원리는 혼 절로 표현된 로직을 더 이상 해소할 수 없는 곳까지 변형해 가는 연역과 간약이다. 컨트롤에는 SLD 도출이 사용된다.
3. 2. 문제 해결
문제 해결은 주어진 목표를 달성하기 위해 논리식을 변형해 나가는 과정이다. 혼 절은 최대 1개의 긍정 리터럴을 갖는 선언 표준형을 기반으로 하며, 명제 논리의 혼 절은 AND-OR 트리에 투영할 수 있다.
도출 원리는 주어진 사실로부터 새로운 사실을 연역하는 전향 연쇄와, 주어진 목표가 사실인지 확인하는 후향 연쇄로 나뉜다. 전향 연쇄는 주어진 사실로부터 다양한 다른 사실을 목표로 하여 해답을 구하는 연역 수법으로, 전문가 시스템 등에서 사용된다. 후향 연쇄는 주어진 목표가 사실인지 여부를 해답으로 구하는 연역 수법으로, 프롤로그 등에서 사용된다.
술어 논리의 혼 절은 AND-OR 트리의 각 노드가 명제에서 술어가 되므로 더 복잡하다. 각 노드의 술어 기호의 항은 정항과 변항으로 나뉘지만, 정항이 사실이고 변항이 단일화에 의한 사실에 묶일 수 있다면, 그 노드는 술어에서 명제가 될 수 있다.
3. 3. 실패에 의한 부정
실패에 의한 부정(Negation as failure, NAF)은 목표 증명에 실패하면 그 부정을 참으로 간주하는 추론 규칙이다.[35] 초기 프롤로그 시스템의 기능이었으며, 마이크로 플래너에도 유사한 구조가 존재했다. 프롤로그에서는 '\+' 연산자를 사용하여 구현된다.[35]
NAF의 논리적 의미는 키스 클라크에 의해 정립되었는데,[35] 그는 특정 조건 하에서 NAF가 일차 논리에서 로직 프로그램의 '완전성'을 사용하여 논리적 결과 의미론으로 추론하는 효율적이고 정확하며 (때로는 완전한) 방법임을 보였다. 완전성은 대략적으로 머리에 동일한 술어가 있는 모든 프로그램 절 집합을 "if and only if(만약 그리고 만약)"를 의미하는 iff
를 사용하여 하나의 논리식으로 간주하는 것을 의미한다. 예를 들어, 다음과 같은 프로그램 절 집합이 있을 때,
```prolog
H :- Body1.
....
H :- Bodyk.
```
이는 다음과 같은 술어의 정의로 표현된다.
```
H iff (Body1 or ... or Bodyk)
```
완전성에는 또한 통일에 해당하는 동일성 공리가 포함된다. 클라크는 SLDNF에 의해 생성된 증명이 프로그램의 완전성을 사용하여 자연 연역 스타일의 추론에 의해 생성된 증명과 구조적으로 유사함을 보여주었다.[35]
실패에의한 부정은 비단조 추론의 한 형태이며, 완전성을 보장하지는 않지만, 프로그램으로서의 완전성(completion)이라는 의미에서 건전한 추론 규칙으로 간주된다. 완전성 개념은 존 매카시의 제약 의미론[36] 및 레이 레이터의 폐쇄 세계 가정과 밀접하게 관련되어 있다.[37]
부정에 대한 완전성 의미론은 SLDNF가 증명-이론적 구현을 제공하는 논리적 결과 의미론이다. 1980년대에는 부정과 관련된 논리 프로그램에 대한 만족성 의미론이 더 인기를 얻었다. 만족성 의미론에서 부정을 논리 프로그램의 의도된 또는 표준 모델에서 진실의 고전적 정의에 따라 해석한다.
음의 조건이 있는 로직 프로그램의 경우 만족성 의미론에는 잘 정립된 의미론과 안정 모델 의미론의 두가지 변형이 있다. 잘 정립된 의미론은 수학적 논리에서 귀납적 정의 개념을 일반화하며,[38] XSB 프롤로그는 SLG 해상도를 사용하여 잘 정립된 의미론을 구현한다.[39][40] 안정 모델 의미론은 답변 집합 프로그래밍 (ASP)의 기초가 된다.
잘 정립된 의미론과 안정 모델 의미론 모두 부정이 있는 임의의 로직 프로그램에 적용된다. 그러나 두 의미론은 계층화된 로직 프로그램의 경우 일치한다.
로직 프로그래밍에서 부정을 이해하려는 시도는 추상적 인수 프레임워크의 개발에 기여했다.[41]
3. 4. 지식 표현
논리형 프로그래밍은 선언적 지식과 절차적 지식을 모두 표현하는 데 사용될 수 있다.[49] 프롤로그는 혼 절(Horn clause)과 SLD 도출, 실패에 의한 부정을 활용하여 지식을 표현하고 추론한다.
초기 논리형 프로그래밍은 절차적 지식과 전략적 정보를 표현하는 데 논리를 사용했으나, 최근에는 순전히 선언적인 지식을 표현하는 데 더 집중하고 있다. 여기에는 일반적인 상식 추론 지식과 특정 도메인 전문가 시스템의 전문 지식이 모두 포함된다.
상식 추론의 예로는 상황 계산, 사건 계산, 행동 언어 등에서 형식화된 원인과 결과에 대한 지식이 있다. 다음은 이러한 형식화의 주요 특징을 보여주는 단순화된 예시다.
```prolog
holds(Fact, Time2) :-
happens(Event, Time1),
Time2 is Time1 + 1,
initiates(Event, Fact).
holds(Fact, Time2) :-
happens(Event, Time1),
Time2 is Time1 + 1,
holds(Fact, Time1),
not(terminated(Fact, Time1)).
terminated(Fact, Time) :-
happens(Event, Time),
terminates(Event, Fact).
```holds
는 메타 술어로, 첫 번째 인수는 사실, 두 번째 인수는 시간(또는 상태)이다. holds(Fact, Time)
은 `Fact`가 `Time`에 유지됨을, happens(Event, Time)
은 `Event`가 `Time`에 발생함을 나타낸다. 시간 변화는 사실을 플루언트라고 한다.
위 절들을 사용하여 블록 세계에서 인과 관계에 대해 추론할 수 있다. 순방향 추론과 역방향 추론은 동일한 결과를 생성하지만, 순방향 추론은 플루언트를 시간 순서로, 역방향 추론은 회귀와 같이 플루언트를 '회귀적'으로 생성한다.
논리형 프로그래밍은 전문가 시스템에서 특정 도메인의 전문 지식을 표현하는 데 유용하다. 일반적인 상식과 달리, 인간의 전문 지식은 대부분 암묵지이므로 명시적 규칙으로 표현하기 어렵다. 그러나 논리 프로그램이 비즈니스 조직이나 법적 권한의 기존 명시적 규칙을 표현하는 데 사용될 때는 이러한 어려움이 발생하지 않는다.
영국 국적법의 첫 번째 문장을 단순화하여 표현하면 다음과 같다.
```prolog
initiates(birth(Person), citizen(Person, uk)):-
time_of(birth(Person), Time),
place_of(birth(Person), uk),
parent_child(Another_Person, Person),
holds(citizen(Another_Person, uk), Time).
```
1980년대에 영국 국적법의 상당 부분을 논리 프로그램으로 표현한 것은 "법률의 계산적 표현 개발에 매우 큰 영향을 미쳤다."[49] 최근에는 PROLEG 시스템이 일본 민법과 대법원 판례 규칙을 포함하여 세계에서 가장 큰 법률 규칙 기반이 되었다.
지식 표현은 선언적 지식과 절차적 지식으로 나뉜다. "하늘에서 물"에 대한 지식은 선언적으로 "비"로, 절차적으로 "우산을 쓴다" 등으로 표현된다. 논리 프로그래밍은 프롤로그의 혼 절과 후향 연쇄의 SLD 유도, 실패에 의한 부정을 이용한 비단조 논리를 통해 선언적 지식과 절차적 지식을 혼합하여 표현한다.
4. 파생 분야
4. 1. 병행 논리 프로그래밍
병행 논리 프로그래밍은 논리 프로그래밍과 병행 프로그래밍의 개념을 통합한 것이다. 1980년대에 일본 제5세대 컴퓨터 프로젝트(FGCS)의 시스템 프로그래밍 언어로 선택되면서 큰 동력을 얻었다.[67]병행 논리 프로그램은 보호된 혼 절 집합으로 구성된다.
::
H :- G1, ..., Gn | B1, ..., Bn.
여기서
G1, ... , Gn
는 절의 가드이며, }}는 커밋 연산자이다. 선언적으로는 일반적인 논리적 함축으로 읽힌다.::
H if G1 and ... and Gn and B1 and ... and Bn.
절차적으로는, 머리
H
가 주어진 목표와 일치하는 절이 여러 개 있을 때, 모든 절이 병렬로 실행되어 해당 가드가 참인지 확인한다. 두 개 이상의 절의 가드가 참이면, 하나의 절에 커밋된 선택이 이루어지고, 선택된 절의 하위 목표로 실행이 진행된다. 이러한 하위 목표도 병렬로 실행될 수 있다. 따라서 병행 논리 프로그래밍은 "알 수 없는 비결정성"이 아닌 "신경 쓰지 않는 비결정성"의 한 형태를 구현한다.칼 휴잇은 병행 계산의 비결정성 때문에 병행 논리 프로그래밍이 일반적인 병행성을 구현할 수 없다고 주장했다.[68] 그러나 논리적 의미론에 따르면, 병행 논리 프로그램의 계산 결과는 프로그램의 논리적 결과이며, 모든 논리적 결과를 도출할 수 있는 것은 아니다.
동시 제약 논리 프로그래밍[69]은 동시 논리 프로그래밍과 제약 논리 프로그래밍을 결합하여 제약을 사용하여 동시성을 제어한다. 여러 절의 가드가 충족되면 동시 제약 논리 프로그래밍은 하나만 사용하도록 약속된 선택을 한다.
키스 클락(Keith Clark), 에르베 갈레르(Hervé Gallaire), 스티브 그레고리(Steve Gregory), 비제이 사라스와트(Vijay Saraswat), 우디 샤피로(Udi Shapiro), 우에다 카즈노리(上田和紀) 등은 공유 변수의 유니피케이션 기능과 메시지를 위한 데이터 구조 스트림 기능을 갖춘 병렬 논리 프로그래밍 언어를 개발했다. 수리 논리학에 기초한 병렬 프로그래밍의 기초를 다지기 위한 연구였으며, 이것이 제5세대 컴퓨터의 기반이 되었다.
병렬 논리 프로그래밍은 제약 논리 프로그래밍과 결합하여 제약으로 병렬 실행을 제어하는 병렬 제약 프로그래밍으로 통합되었으며, 사라스와트 등에 의해 이론화되었다. 칸(Kahn)과 사라스와트는 병렬 제약 프로그래밍의 틀 내에서 제약 설정을 통해 액터 모델을 구현할 수 있다는 점을 들어 액터 모델은 병렬 제약 프로그래밍의 특별한 경우라고 주장했다[82]。
4. 2. 제약 논리 프로그래밍
제약 논리 프로그래밍(CLP)은 혼(Horn) 절 논리 프로그래밍과 제약 해결(constraint solving)을 결합한 프로그래밍 패러다임이다.[52] 절의 본문에서 제약 술어로 선언된 일부 술어가 리터럴로 나타날 수 있도록 혼 절을 확장한다. 제약 술어는 프로그램의 사실과 규칙에 의해 정의되지 않고, 특정 도메인별 모델-이론적 구조 또는 이론에 의해 미리 정의된다.술어가 프로그램에 의해 정의된 서브골은 일반적인 논리 프로그래밍에서와 같이 목표 축소를 통해 해결되지만, 제약 조건은 제약 술어의 의미론을 구현하는 도메인별 제약 해결기에 의해 단순화되고 만족 가능성이 검사된다. 초기 문제는 만족스러운 제약 조건의 결합으로 줄임으로써 해결된다.
프롤로그의 첫 번째 버전은 필립 루셀의 1972년 박사 학위 논문에서 가져온 제약 술어 dif(term1, term2)를 이미 포함하고 있었는데, 이 술어는 두 인수가 서로 다른 경우 성공하지만, 인수가 변수를 포함하는 경우 지연된다.[52]
다음 제약 논리 프로그램은 `존`의 교사로서의 기록을 나타내는 장난감 시계열 데이터베이스를 나타낸다.
```prolog
teaches(john, hardware, T) :- 1990 ≤ T, T < 1999.
teaches(john, software, T) :- 1999 ≤ T, T < 2005.
teaches(john, logic, T) :- 2005 ≤ T, T ≤ 2012.
rank(john, instructor, T) :- 1990 ≤ T, T < 2010.
rank(john, professor, T) :- 2010 ≤ T, T < 2014.
```
여기서 `≤`와 `<`는 일반적인 의도된 의미론을 가진 제약 술어이다. 다음 목표 절은 `존`이 `논리`를 가르치고 `교수`였던 시기를 알아내기 위해 데이터베이스를 쿼리한다.
```prolog
?- teaches(john, logic, T), rank(john, professor, T).
```
해결책 `2010 ≤ T, T ≤ 2012`는 제약 조건 `2005 ≤ T, T ≤ 2012, 2010 ≤ T, T < 2014.`을 단순화한 결과이다.
제약 논리 프로그래밍은 토목 공학, 기계 공학, 디지털 회로 검증, 자동 시간표 작성, 항공 교통 관제, 금융 등과 같은 분야의 문제 해결에 사용되어 왔다. 이는 귀납 논리 프로그래밍과 밀접한 관련이 있다. 동시 제약 논리 프로그래밍[69]은 동시 논리 프로그래밍과 제약 논리 프로그래밍을 결합하여 제약을 사용하여 동시성을 제어한다.
제약은 값(원소, 요소, 개체)을 "관계"로 표현한 것으로, 결정 변수의 집합으로 정의되는 계산 대상이다.
4. 3. 고차 논리 프로그래밍
여러 연구자들이 고차 논리에서 파생된 고차 프로그래밍 기능을 사용하여 논리 프로그래밍을 확장했다.[70][71] 술어 기호의 항에 술어 기호를 포함할 수 있도록 하여, 예를 들어 `p(A, B, C) :- q(A, foo), r(B, bar), C.`에서 C를 별개의 술어 기호로 만들 수 있다. 템플릿 메타적인 서식도 다루고 있으며, `p(A, B, C) :- (C)(A, B)`에서는 C가 술어명이고 A와 B가 그 항이 된다. 이러한 언어에는 프롤로그 확장인 HiLog/HiLog영어와 λProlog/ΛProlog영어가 있다.[70][71]4. 4. 함수 논리 프로그래밍
함수 논리 프로그래밍은 술어 기호와 함수 기호를 모두 리터럴로 사용하는 프로그래밍 패러다임이다.[28] 논리형 프로그래밍은 함수가 관계의 특수한 경우인 함수형 프로그래밍의 일반화로 볼 수 있다.[28] 예를 들어, 함수 mother(X) = Y (모든 X는 하나의 어머니 Y를 갖는다)는 관계 mother(X, Y)로 표현될 수 있다. 이러한 측면에서 논리형 프로그램은 함수를 관계로 표현하는 관계형 데이터베이스와 유사하다.관계형 구문과 비교하여, 함수형 구문은 중첩된 함수에 대해 더 간결하다. 예를 들어, 함수형 구문에서 외할머니의 정의는 다음과 같이 중첩된 형태로 작성할 수 있다.
```prolog
maternal_grandmother(X) = mother(mother(X)).
```
관계형 표기법으로 동일한 정의는 중첩되지 않은, 평탄화된 형태로 작성해야 한다.
```prolog
maternal_grandmother(X, Y) :- mother(X, Z), mother(Z, Y).
```
그러나 중첩 구문은 중첩되지 않은 구문에 대한 구문적 설탕으로 간주될 수 있다. 예를 들어 Ciao 프롤로그는 함수형 구문을 관계형 형태로 변환하고 표준 프롤로그 실행 전략을 사용하여 결과 논리형 프로그램을 실행한다.[29] 또한, 동일한 변환을 사용하여 함수형이 아닌 중첩된 관계를 실행할 수 있다.
```prolog
grandparent(X) := parent(parent(X)).
parent(X) := mother(X).
parent(X) := father(X).
mother(charles) := elizabeth.
father(charles) := phillip.
mother(harry) := diana.
father(harry) := charles.
?- grandparent(X,Y).
X = harry,
Y = elizabeth.
X = harry,
Y = phillip.
```
label=Mercury/Mercury 언어영어, 등이 함수 논리 프로그래밍을 지원한다.
4. 5. 객체 지향 논리 프로그래밍
F-로직[76]은 객체와 프레임 구문을 사용하여 논리형 프로그래밍을 확장한다.로그톡[77]은 객체, 프로토콜 및 기타 OOP 개념 지원을 통해 프롤로그 프로그래밍 언어를 확장한다. 대부분의 표준 준수 프롤로그 시스템을 백엔드 컴파일러로 지원한다. 팩트와 규칙을 묶은 모듈을 다루며, `module.predicate(A, B, C)`와 같이 표기할 수 있다. 모듈은 객체 지향에서 파생된 상속과 다형성을 갖는다. 상위 모듈을 상속하여 새로운 하위 모듈을 정의할 수 있으며, 상위 모듈의 변수에 하위 모듈을 대입하여 서브타이핑하는 것이 다형성이다. 예를 들어 `var.predicate(A, B, C)`에서 상위 변수 `var`에 하위 모듈 A를 대입하면 A의 `predicate`로 해석되고, 동일 변수에 하위 모듈 B를 대입하면 B의 `predicate`로 해석된다.
Visual Prolog는 객체 지향 논리 프로그래밍을 지원하는 언어이다.
4. 6. 선형 논리 프로그래밍
선형 논리에 기반한 논리 프로그래밍은 고전 논리에 기반한 논리 프로그래밍 언어보다 훨씬 더 표현력이 풍부하다.[72] 혼절 절 프로그램은 술어의 인자 변화를 통해서만 상태 변화를 나타낼 수 있다. 선형 논리 프로그래밍에서는 주변 선형 논리를 사용하여 상태 변경을 지원할 수 있다. 선형 논리에 기반한 논리 프로그래밍 언어의 초기 설계에는 LO,[72] Lolli,[73] ACL,[74] 및 Forum[75]이 있다. Forum은 모든 선형 논리에 대한 목표 지향적 해석을 제공한다.4. 7. 귀납 논리 프로그래밍
귀납적 논리 프로그래밍(en: Inductive Logic Programming, ILP)은 기계 학습에 귀납적 추론을 적용하여, 주어진 배경 지식과 긍정적/부정적 예시를 바탕으로 새로운 규칙(일반화된 논리 프로그램)을 생성하는 논리형 프로그래밍의 한 분야이다.[63][64] 예를 들어, mother_child와 father_child 관계에 대한 배경 지식과 grandparent_child 관계의 예시가 주어지면, ILP 시스템은 parent_child 관계로 해석될 수 있는 auxiliary 술어를 포함하는 grandparent_child의 정의를 생성할 수 있다.[65]ILP는 ALP와 유사하게 관찰을 설명하는 가설을 생성하고 제약 조건을 사용하여 원치 않는 가설을 배제한다. 하지만 ALP에서 가설이 변수가 없는 사실인 반면, ILP에서 가설은 일반 규칙이다.[63][64] 스튜어트 러셀은 새로운 개념의 발명을 인간 수준의 AI에 도달하는 데 필요한 가장 중요한 단계라고 언급했다.[66]
ILP의 최근 연구는 논리 프로그래밍, 학습 및 확률을 결합하여 통계적 관계 학습 및 확률적 귀납적 논리 프로그래밍 분야를 발전시켰다. ILP는 연역 추론과는 달리 귀납 추론을 다룬다.
4. 8. 가설 논리 프로그래밍
귀추 논리 프로그래밍(ALP)은 절의 본문에 절에 의해 정의되지 않은 술어를 포함하도록 허용하여 일반적인 논리 프로그래밍을 확장한다. ALP에서 이러한 술어는 '귀납적'(또는 '가정 가능')으로 선언되며, 귀추 추론에서 관찰을 설명하거나, 목표를 해결하기 위해 프로그램에 새로운 사실(가정)을 추가하는 데 사용된다.예를 들어, 시간 0에 빨간색 블록이 초록색 블록 위에 있고, 초록색 블록이 테이블 위에 있는 초기 상태는 다음과 같다.
```prolog
holds(on(green_block, table), 0).
holds(on(red_block, green_block), 0).
```
다음과 같은 목표가 주어졌을 때,
```prolog
?- holds(on(green_block,red_block), 3), holds(on(red_block,table), 3).
```
목표는 관찰을 나타낼 수 있으며, 이 경우 해결책은 관찰에 대한 설명이다. 또는 목표는 원하는 미래 상황을 나타낼 수 있으며, 이 경우 해결책은 목표 달성을 위한 계획이다.
ALP는 뒤로 추론하고 귀납적 하위 목표를 해결하기 위해 프로그램에 가정을 추가하여 목표를 해결한다. 원인 및 결과에 대한 규칙을 사용하여
happens
술어를 귀납적으로 처리하여 목표를 해결할 수 있다.```prolog
holds(Fact, Time2) :-
happens(Event, Time1),
Time2 is Time1 + 1,
initiates(Event, Fact).
holds(Fact, Time2) :-
happens(Event, Time1),
Time2 is Time1 + 1,
holds(Fact, Time1),
not(terminated(Fact, Time1)).
terminated(Fact, Time) :-
happens(Event, Time),
terminates(Event, Fact).
initiates(move(Object, Place), on(Object, Place)).
terminates(move(Object, Place2), on(Object, Place1)).
```
많은 대체 솔루션이 있는데 그중 일부는 다음과 같다.
```prolog
happens(move(red_block, table), 0).
happens(tick, 1).
happens(move(green_block, red_block), 2).
```
```prolog
happens(tick,0).
happens(move(red_block, table), 1).
happens(move(green_block, red_block), 2).
```
```prolog
happens(move(red_block, table), 0).
happens(move(green_block, red_block), 1).
happens(tick, 2).
```
여기서
두 개의
move
이벤트가 동시에 발생하는 솔루션도 있는데, 예를 들면 다음과 같다.```prolog
happens(move(red_block, table), 0).
happens(move(green_block, red_block), 0).
happens(tick, 1).
happens(tick, 2).
```
원하지 않는 경우, 이러한 솔루션은 ASP의 제약 절과 같은 무결성 제약을 추가하여 제거할 수 있다.
```prolog
:- happens(move(Block1, Place), Time), happens(move(Block2, Block1), Time).
```
귀추 논리 프로그래밍은 고장 진단, 계획, 자연어 처리 및 기계 학습에 사용되었다. 또한 실패를 귀추 추론의 한 형태로 해석하는 데 사용되었다. 가설 추론을 다루고 있으며, 지금까지의 연역 추론과는 다른 종류가 된다.
5. 적용 분야
논리형 프로그래밍은 특정 분야의 지식을 기반으로 추론하여 권장 사항이나 답변을 제공하는 전문가 시스템에 적용된다. 또한, 기존 이론으로부터 새로운 정리를 생성하는 자동 정리 증명 프로그램 개발에도 활용된다. 이 외에도 자연어 처리 및 다양한 인공지능 문제 해결에 사용된다.
참조
[1]
논문
Horn clause computability
1977
[2]
논문
The generalised completeness of Horn predicate-logic as a programming language
https://cyber.bibl.u[...]
1978
[3]
학술회의
Application of Theorem Proving to Problem Solving
https://www.ijcai.or[...]
[4]
학술회의
ABSYS 1: An Incremental Compiler for Assertions: an Introduction
Edinburgh University Press
1969
[5]
논문
The early years of logic programming
http://www.doc.ic.ac[...]
[6]
학술회의
Planner: A Language for Proving Theorems in Robots
https://www.ijcai.or[...]
[7]
논문
Understanding natural language
1972
[8]
기술보고서
QA4, A Procedural Calculus for Intuitive Reasoning
https://apps.dtic.mi[...]
1973-11
[9]
문서
POPLER: a POP-2 planner.
Edinburgh University, Department of Machine Intelligence and Perception.
1971
[10]
기술보고서
The Conniver reference manual
https://www.research[...]
1972-05
[11]
기술보고서
A preliminary QLISP manual
https://www.sri.com/[...]
Artificial Intelligence Center, SRI International
1973-08
[12]
논문
The scientific community metaphor
1981
[13]
학술회의
Computation and Deduction
Czechoslovak Academy of Sciences
1973
[14]
논문
Automatic deduction with hyper-resolution
1965
[15]
논문
Linear Resolution with Selection Function
http://www.doc.ic.ac[...]
1971
[16]
웹사이트
Predicate Logic as a Programming Language
https://www.doc.ic.a[...]
Department of Artificial Intelligence, Edinburgh University
1973
[17]
논문
Prolog-the language and its implementation compared with Lisp
1977
[18]
문서
Logic/constraint programming and concurrency: The hard-won lessons of the fifth generation computer project.
2018
[19]
서적
The Brain Makers: The History Of Artificial Intelligence
The Relayer Group.
2020
[20]
간행물
Advances in Data Base Theory
https://archive.org/[...]
Plenum Press
[21]
서적
Prolog: The Next 50 Years
Springer, Cham.
2023
[22]
논문
Invited Editorial
Cambridge University Press
[23]
논문
Algorithm=Logic + Control
1979-07
[24]
서적
Implementations of Prolog
Ellis Horwood
1984
[25]
학술회의
Heuristic Prolog: logic program execution by heuristic search
Springer Berlin Heidelberg
1985-07
[26]
논문
Logic programming
1985
[27]
논문
XSB: Extending Prolog with tabled logic programming
2012-01
[28]
서적
The Reasoned Schemer, Second Edition
The MIT Press
[29]
문서
A Syntactic Approach to Combining Functional Notation, Lazy Evaluation and Higher-Order in LP Systems.
2006-04
[30]
문서
Relational linear programming.
2017
[31]
문서
Relational programming with CrocoPat.
2006-05
[32]
문서
Overview of relational programming.
1983
[33]
문서
RELVIEW—A system for calculating with relations and relational programming.
Springer Berlin Heidelberg.
1998
[34]
논문
The semantics of predicate logic as a programming language
1976-10
[35]
서적
Logic and Data Bases
Springer US
1977
[36]
논문
On the relationship between circumscription and negation as failure
1989
[37]
논문
Negation as failure: a comparison of Clark's completed data base and Reiter's closed world assumption
1984
[38]
논문
A logic of nonmonotone inductive definitions
https://lirias.kuleu[...]
2008
[39]
간행물
XSB: A system for efficiently computing well-founded semantics
Springer Berlin Heidelberg
1997-07-28
[40]
논문
Tabled Evaluation with Delaying for General Logic Programs
1996-01
[41]
논문
On the acceptability of arguments and its fundamental role in nonmonotonic reasoning, logic programming, and n–person games
[42]
문서
The birth of Prolog
History of programming languages---II
1996
[43]
문서
Prolog-the language and its implementation compared with Lisp
1977
[44]
서적
Mind: Introduction to Cognitive Science
https://www.google.c[...]
The MIT Press
[45]
서적
Human reasoning and cognitive science
https://archive.org/[...]
MIT Press
[46]
문서
The proper treatment of events
https://citeseerx.is[...]
John Wiley & Sons
2008
[47]
문서
The frame problem in the situation calculus: A simple solution (sometimes) and a completeness result for goal regression
1991
[48]
문서
Building expert systems in Prolog
https://ds.amu.edu.e[...]
Springer Science & Business Media
2012
[49]
논문
The British Nationality Act as a logic program
http://www.doc.ic.ac[...]
1986
[50]
논문
Law and logic: a review from an argumentation perspective
https://www.scienced[...]
2015-10
[51]
문서
PROLEG: Practical legal reasoning system
Springer Nature Switzerland
2023
[52]
논문
Fifty Years of Prolog and Beyond
2022-11
[53]
문서
Transaction Logic Programming
ICLP
1993-02
[54]
문서
Dynamic logic programming
Springer Nature Switzerland
2023
[55]
문서
Combining logic programming and imperative programming in LPS
Springer Nature Switzerland
2023
[56]
문서
Universality of data retrieval languages
Proceedings of the 6th ACM SIGACT-SIGPLAN symposium on Principles of programming languages
1979-01
[57]
문서
Datalog: concepts, history, and outlook
Declarative Logic Programming: Theory, Systems, and Applications
2018
[58]
문서
Answer Set Programming: A Primer
Reasoning Web. Semantic Technologies for Information Systems: 5th International Summer School 2009, Brixen-Bressanone, Italy, August 30-September 4, 2009, Tutorial Lectures
2009
[59]
논문
Constraint Answer Set Programming without Grounding
2018
[60]
논문
Special issue: abductive logic programming
2000-07
[61]
문서
Abductive Planning with Event Calculus
ICLP/SLP
1988-08
[62]
문서
Abduction Compared with Negation by Failure
ICLP
1989-06
[63]
서적
Foundations of inductive logic programming
Springer
1997
[64]
문서
On the relation between abduction and inductive learning
Abductive Reasoning and Learning
2000
[65]
문서
Inductive logic programming at 30: a new introduction
2022
[66]
서적
Human compatible: Artificial intelligence and the problem of control
Penguin
2019
[67]
문서
Proceedings of the FGCS Project Evaluation Workshop
Institute for New Generation Computer Technology (ICOT)
1992
[68]
웹사이트
Inconsistency Robustness for Logic Programs
https://hal.archives[...]
Hal Archives
2016-04-27
[69]
문서
Concurrent constraint programming
Proceedings of the 17th ACM SIGPLAN-SIGACT symposium on Principles of programming languages
1989-12
[70]
논문
HiLog: A foundation for higher-order logic programming
1993-02
[71]
논문
Higher-order logic programming
Springer Berlin Heidelberg
1986-07-01
[72]
간행물
Logic Programming with Focusing Proofs in Linear Logic
1992-06-01
[73]
간행물
Logic Programming in a Fragment of Intuitionistic Linear Logic
http://repository.up[...]
1994-01-01
[74]
학회자료
Asynchronous communication model based on linear logic
1994-01-01
[75]
간행물
Forum: A Multiple-Conclusion Specification Logic
1996-09-30
[76]
논문
F-logic: a higher-order language for reasoning about objects, inheritance, and scheme
1989-06-01
[77]
학위논문
Design of an Object-Oriented Logic Programming Language
Universidade da Beira Interior
2003-01-01
[78]
논문
FLORA: Implementing an efficient DOOD system using a tabling logic engine
Springer Berlin Heidelberg
2000-07-01
[79]
문서
The birth of Prolog
[80]
문서
The Early Years of Logic Programming
[81]
간행물
Algorithm=Logic + Control
1979-07-01
[82]
문서
Actors as a Special Case of Concurrent Constraint Programming
[83]
서적
Foundations of Logic Programming (2nd edition)
Springer-Verlag
1987-01-01
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com