15장 논리형 프로그래밍
Download
Report
Transcript 15장 논리형 프로그래밍
프로그래밍 언어론
2nd edition
Tucker and Noonan
15장
논리형 프로그래밍
문: 만약 꼬리를 다리라 부른다면 개는 얼마나 많은 다리를 갖고 있나?
답: 4개. 꼬리를 다리라고 부른다고 해도 다리가 되진 않는다.
애이브러햄 링컨 (Abraham Lincoln)
Copyright © 2006 The McGraw-Hill Companies, Inc.
소목차
15.1 논리와 혼 절
15.2 Prolog 논리형 프로그래밍
15.2.1 Prolog 프로그램의 구성 요소
15.2.2 Prolog 실행의 실제
15.3 Prolog 예제
15.3.1 미분
15.3.2 단어 퍼즐
15.3.3 자연어 처리
15.3.4 Clite의 의미구조
15.3 5 여덞 여왕말 문제
Copyright © 2006 The McGraw-Hill Companies, Inc.
논리와 혼 절
혼 절(Horn clause)는 단순논리식인 머리 h와
단순논리식들인 몸체 p1, p2, …, pn으로 구성
h p1, p2, …, pn
p1, p2, …, pn 이 모두 참일 때 h 또한 참이란 뜻
예,
snowing(C) precipitation(C), freezing(C)
C 도시에 강수량이 있고 C 도시의 온도가 얼
정도일 때 C 도시에서 눈이 온다.
Copyright © 2006 The McGraw-Hill Companies, Inc.
혼 절과 논리식
다음 혼 절은
h p1, p2, …, pn
은 다음 논리식과 같다.
p1 p2 … pn h 또는
(p1 p2 … pn) h
모든 논리식이 혼 절로 쓸 수 있는 것은 아니다.
예, literate(x) reads(x) writes(x)
Copyright © 2006 The McGraw-Hill Companies, Inc.
도출과 동일화
도출(resolution): 다음과 같은 혼 절들이 있을때
h terms
t t1, h, t2
h가 매치되므로 아랫줄의 h를 terms로 치환 가능
t t1, terms, t2
실체화(instantiation): 도출 과정 중 변수를
결정하는 것
동일화(unification): 도출 과정 중 변수를 어떻게
실제화할지 결정하는 패턴 검사 과정
Copyright © 2006 The McGraw-Hill Companies, Inc.
예
두 혼절에서
speaks(Mary, English)
talkswith(X, Y) speaks(X, L), speaks(Y, L), XY
아래와 같이 도출 가능
talkswith(Mary, Y) speaks(Mary, English),
speaks(Y, English), MaryY
X는 Mary로 L은 English로 실체화되었음
Copyright © 2006 The McGraw-Hill Companies, Inc.
15.2 Prolog 논리형 프로그래밍
논리형 프로그래밍에서는 자세한 알고리즘을 기술하는
것이 아니라 목적만 정의
인공지능과 DB에서 사용됨
–
–
–
–
자연어 처리
자동 추론 및 정리 증명
전문가 시스템 (예: MYCIN)
DB 검색, 구조적 질의 언어 (SQL, Structured Query Language)
1970 년대 Prolog 탄생, 주요 특징:
– 비결정성 (nondeterminism)
– 되추적 (backtracking)
Copyright © 2006 The McGraw-Hill Companies, Inc.
15.2.1 Prolog 프로그램의 구성 요소
Prolog 프로그램은 항(term)으로 구성, 항은 다음 중
하나
– 변수
– 상수
– 복합 항
변수는 대문자로 시작, 예: Bob
상수는 정수나 단어(atom), 예: 24, the, zebra, ‘Bob’
복합 항은 술어와 인수로 구성, 함수 표기법 사용,
예: n(zebra), speaks(Y, English), np(X, Y)
– 복합 항의 인수의 개수를 인수 수(arity)라 함
Copyright © 2006 The McGraw-Hill Companies, Inc.
사실, 규칙, 프로그램
사실(fact)은 우측 조건이 없는 혼 절, 끝에 마침표를
찍음
term.
규칙(rule)은 우측 조건이 있는 혼 절, 대신 :-를
사용하고 끝에 마침표를 찍음.
term :- term1, term2, … termn.
프로그램(program)은 사실과 규칙의 모음.
Copyright © 2006 The McGraw-Hill Companies, Inc.
예제 프로그램
speaks(allen, russian).
speaks(bob, english).
speaks(mary, russian).
speaks(mary, english).
talkswith(X, Y) :- speaks(X, L), speaks(Y, L), X \= Y.
4 개의 사실과 하나의 규칙으로 구성됨
규칙은 모든 변수가 실체화되어 우측이 모두 참이 될 때 성공.
예, X=allen, Y=mary, L=russian으로 실체화되면 성공.
X=allen, Y=bob과 같은 실체화에 대해서는 실패.
Copyright © 2006 The McGraw-Hill Companies, Inc.
질의
질의(query)는 성공여부를 알고자 하는 사실 또는
규칙.
?- speaks(Who, russian).
위의 질의는 Who를 어떻게 실체화하면
speaks(Who, russian)가 성공하는지 묻는 것.
프로그램은 consult 질의를 통해 파일에서 읽어
옴.
?- consult(speaks).
speaks 이름의 파일을 읽어 옴.
Copyright © 2006 The McGraw-Hill Companies, Inc.
동일화를 통해 질의에 응답
다음 질의의 답을 찾으려면
?- speaks(Who, russian).
Prolog는 speaks를 머리로 하는 모든 사실과
규칙을 고려한다.
도출과 동일화를 통해 다음 성공들을 찾는다.
Who = allen ;
Who = mary ;
No
– 중간에 세미콜론 ;을 치면 “답을 또 찾으라는”
뜻이다.
Copyright © 2006 The McGraw-Hill Companies, Inc.
검색
질의 ?- talkswith(Who, allen)에 대한 검색 중 첫번째 시도
그림 15.2
Copyright © 2006 The McGraw-Hill Companies, Inc.
족보
그림 15.4
Copyright © 2006 The McGraw-Hill Companies, Inc.
Prolog 프로그램
그림 15.3
mother(mary, sue).
mother(mary, bill).
mother(sue, nancy).
mother(sue, jeff).
mother(jane, ron).
father(john, sue).
father(john, bill).
father(bob, nancy).
father(bob, jeff).
father(bill, ron).
parent(A,B) :- father(A,B).
parent(A,B) :- mother(A,B).
grandparent(C,D) :- parent(C,E), parent(E,D).
Copyright © 2006 The McGraw-Hill Companies, Inc.
DB 검색 질의
jeff의 부모가 누구지?
?- parent(Who, jeff).
Who = bob;
Who = sue
ron의 조부모는?
?- grandparent(Who, ron).
형제는 다음과 같이 추가 가능
?- sibling(X, Y) :- parent(W, X), parent(W, Y), X\=Y.
Copyright © 2006 The McGraw-Hill Companies, Inc.
리스트
리스트는 대괄호로 묶고 쉼표로 분리한 텀의 나열
–
–
–
–
–
빈 리스트는 [].
문장 “The giraffe dreams”는: [the, giraffe, dreams]
관심 없는 원소는 _로: [_, X, Y]
수직 막대를 사용해 표기 가능:[Head | Tail]
리스트에 관한 함수
append: 두 리스트 결합
member: 리스트에 속했는지 검사
Copyright © 2006 The McGraw-Hill Companies, Inc.
append 함수
append([], X, X).
append([Head | Tail], Y, [Head | Z]) :append(Tail, Y, Z).
위 정의를 읽어 보면:
1. 리스트 X에 빈 리스트를 연결하면 X
2. Z가 Tail과 Y를 연결한 리스트이면, [Head | Tail]과 Y를
연결한 리스트는 [Head | Z]
Copyright © 2006 The McGraw-Hill Companies, Inc.
member 함수
member(X, [X | _]).
member(X, [_ | Y]) :- member(X, Y).
X가 리스트의 원소라면 둘 중에 하나는 만족:
1. 리스트 [X | _]의 머리가 X
2. 리스트 [_ | Y]의 꼬리 Y에 속함
패턴 매치 과정에 같은지 검사하는 과정이 녹아 있음.
관심 없다고 _ 표기한 부분은 정의에서 중요하지 않음.
Copyright © 2006 The McGraw-Hill Companies, Inc.
추가 리스트 함수
X에 어떤 Y를 붙여 Z가 되면, X는 Z의 접두사.
prefix(X, Z) :- append(X, Y, Z).
어떤 X에 Y를 붙여 Z가 되면, Y는 Z의 접미사.
suffix(Y, Z) :- append(X, Y, Z).
리스트의 모든 접두사를 찾는 예제:
?- prefix(X, [my, dog, has, fleas]).
X = [];
X = [my];
X = [my, dog];
…
Copyright © 2006 The McGraw-Hill Companies, Inc.