1. 4.4 Logic Programming
논리로 프로그램 짜기
http://ohyecloudy.com
http://cafe.naver.com/architect1.cafe
2009.03.28
2. 관계로 프로그램을 짜기
• 계산
– 값 하나를 나타내는 함수가 아니라 여러 값 사
이의 관계를 다루는 것을 뜻함.
• 비 결정적 언어
– 식 하나가 여러 값을 나타낼 수 있다.
3. 논리 중심 프로그래밍 언어
• 관계로 프로그래밍 짜기
• + 동일화(unification)
– 기호 패턴 매칭(symbolic pattern matching)의
핚 기법
– 훨씬 편리하고 뛰어난 표현력 제공
4. 예제 – APPEND 연산
• 규칙
– 리스트 y가 있을 때, 비어 있는 리스트와 y를
append하면 y가 된다.
– u,v,y,z가 있을 때, (cons u v)와 y를 append하
면 (cons u z)가 된다. 여기서 z는 v와 y를
append핚 것이다.
5. 프로시저 중심 언어
(define (append x y)
(if (null? x)
y
(cons (car x) (append (cdr x) y))))
1. (a b)와 (c d)를 append핚 것을 찾아라. - OK
2. (a b)와 append해서 (a b c d)를 만드는 리스트 y를 찾아라. - NO
3. append하여 (a b c d)를 만들어 내는 x와 y를 모두 찾아라. – NO
• 답을 구하지는 못하지만 2,3번은 append
연산의 규칙을 따르면 답할 수 있는 문제.
6. 논리 프로그래밍 언어
• 규칙만 정의
– 리스트 y가 있을 때, 비어 있는 리스트와 y를
append하면 y가 된다.
– u,v,y,z가 있을 때, (cons u v)와 y를 append하
면 (cons u z)가 된다. 여기서 z는 v와 y를
append핚 것이다.
• 어떻게(how to)는 실행기가 알아서
7. 쿼리 언어?
• == 논리 프로그래밍 언어.
• DB에서 필요핚 정보를 뽑아내는 질문(쿼
리)을 언어 형태로 정형화.
• 쿼리를 정의 : 무엇을(what is)
• DB 시스템에서 어떻게(how to)를 알아서
해준다.
13. 규칙의 결과
• 규칙 결과는 참말(assertion)의 집합
• 규칙의 몸(쿼리)을 만족하도록 변수를 값
으로 맞바꾸어서 찍어낼 수 있는 모든 규
칙의 결과(패턴)
;; query
(lives-near ?x (Bitdiddle Ben))
;; result
(lives-near (Reasoner Louis) (Bitdiddle Ben))
(lives-near (Aull DeWitt) (Bitdiddle Ben))
14. 프로그램으로서의 논리
• 규칙에 바탕을 두고 논리에 따라 엯역식
추론(logical deduction)
– 연역법(deduction) : 이미 증명된 명제를 젂제
로 새로운 명제를 결롞으로 이끌어 낸다.
– 규칙의 몸(쿼리)을 만족하도록 패턴 변수에 값
을 집어넣고 이 방법으로 결롞을 만족시킴.
15. 예제 – APPEND 연산
(rule (append-to-form () ?y ?y))
;; 리스트 y가 있을 때, 비어 있는 리스트와 y를 append하면 y가 된다.
(rule (append-to-from (?u . ?v) ?y (?u . ?z))
(append-to-from ?v ?y ?z))
;; u,v,y,z가 있을 때, (cons u v)와 y를 append하면 (cons u z)가 된다.
;; 여기서 z는 v와 y를 append한 것이다.
• 규칙만 정의.
• 어떻게(how to)는 실행기가 알아서 해줌.
16. 예제 – APPEND 연산
;;; Query input:
(append-to-form (a b) (c d) ?z)
;;; Query results:
(append-to-form (a b) (c d) (a b c d))
;;; Query input:
(append-to-form (a b) ?y (a b c d))
;;; Query results:
(append-to-form (a b) (c d) (a b c d))
;;; Query input:
(append-to-form ?x ?y (a b c d))
;;; Query results:
(append-to-form () (a b c d) (a b c d))
(append-to-form (a) (b c d) (a b c d))
(append-to-form (a b) (c d) (a b c d))
(append-to-form (a b c) (d) (a b c d))
(append-to-form (a b c d) () (a b c d))
19. 패턴 매처(pattern matcher)
변수 일람표
데이터
1데이터를 패턴에 맞출 수 있나?
패턴
변수
2-a그 과정에서 정의된 놈을 넣는다.
OK!
패턴
변수
NO! 맞추지 못핚다고 알린다.
패턴 2-b
3
변수 일람표를 값으로 내놓는다.
20. 빈 일람표에서 시작. 성공
변수 일람표
데이터 (a b a)
?x : a
?y : b
패턴 (?x ?y ?x)
변수 일람표를 값으로 내놓는다.
21. 일람표 변수 사용. 실패
변수 일람표
데이터
(a b a)
?y : a
NO! 맞추지 못핚다고 알린다.
패턴 (?x ?y ?x)
22. 변수 일람표에 추가. 성공
변수 일람표
데이터
(a b a)
?y : b
?x : a
패턴
(?x ?y ?x)
변수 일람표를 값으로 내놓는다.
23. 변수 일람표들의 스트림
일람표들의 일람표들의
입력 스트림 출력 스트림
쿼리
( job ?x ?y)
DB 속에 있는 참말(assertion)들의 스트림
24. 변수 일람표들의 스트림
패턴
쿼리
( job ?x ?y)
변수 일람표 변수 일람표
?x : a
?x : a
?x : a
데이터
25. 동일화(unification)
• 결롞이 정해진 쿼리 패턴과 맞아떨어지는
규칙만 찾을 수 있어야 핚다.
• 규칙의 결론에 변수가 들어갈 수 있기 때
문에 그에 맞추어 패턴 매칭 기능을 늘릴
필요가 있다.
• ‘패턴’과 ‘데이터’ 모두 변수를 가질 수 있
다.
26. 동일화 함수(unifier)
패턴 패턴
상수
변수
상수
변수
변수 자리에 알맞은 값을 넣어서
패턴을 같게 만들 수 있는지 판단 변수 일람표
MAKE! ?x : a
?x : a
?x : a
27. 동일화 함수(unifier) 동작 예-1
패턴 패턴
(?x a ?y) (?y ?z a)
변수 일람표
MAKE! ?x : a
?y : a
?z : a
28. 동일화 함수(unifier) 동작 예-2
패턴 패턴
(?x a) ((b ?y) ?z)
변수 일람표
MAKE! ?x : (b ?y)
?y :
?z : a
29. 규칙 적용하기
(lives-near ?x (Hacker Alyssa P))
(rule (lives-near ?person-1 ?person-2)
(and (address ?person-1 (?town . ?rest-1))
(address ?person-2 (?town . ?rest-2))
(not (same ?person-1 ?person-2))))
• 일람표
– ?person-2 Hacker Alyssa P
– ?x ?person-1
• 쿼리를 처리
• 매칭이 성공으로 끝나면 패턴 매처가 내 놓은 일람표
에 ?person-1 정의가 있고 이게 ?x 값이다.
• 이 값을 쿼리 패턴에서 데이터로 찍어낸다.
30. Lisp : eval/apply 실행기와 비교
• 쿼리 실행기
– 쿼리를 규칙의 결롞에 동일화하는 일이 성공으로
끝나면, 그에 맞추어 처음에 받았던 일람표에 알
맞은 정보를 보탠다.
– 그렇게 확장된 일람표를 맞추어 규칙의 몸을 구성
하는 쿼리를 처리핚다.
• eval/apply 실행기
– 프로시저의 매개변수를 받아온 인자 값으로 정의
하여, 처음 프로시저 홖경을 확장한 일람표를 구
성핚다.
– 확장된 홖경에 맞추어 프로시저의 몸을 이루는 식
의 값을 구한다.
31. 규칙을 적용한 간단한 쿼리
• 생성하는 스트림
1. 패턴 매처를 가지고 DB에 있는 모든 참말에
패턴을 맞추어 보는 과정에서 확장된 일람표
의 스트림
2. 동일화 함수를 가지고 쓸 수 있는 모든 규칙
을 적용하는 과정에서 확장된 일람표의 스트
림
• 이 두 스트림을 붙여서 하나의 스트림을
만든다.
32. 쿼리 실행기와 드라이버 루프
• 쿼리 실행기 : qeval
– Lisp의 eval 프로시저와 비슷
– 인자 : 쿼리 하나와 일람표 스트림 하나
– 출력 : 일람표 스트림
• 드라이버 루프
– 터미널(terminal)에서 쿼리를 읽는다.
– 읽을 때마다 쿼리와 빈 일람표를 qeval에 인자로
넘긴다.
– qeval 출력 일람표로 터미널로부터 읽은 쿼리에
서 데이터를 찍어낸다.
34. 수학 논리를 따르는가?
• 수학 논리에서 절차대로 해석할 수 있는
부분 집합을 빌어다 쓴다.
• 참말(assertion) : 씨 명제(atomic proposition)
• 규칙(rule) : 함의(implication)
– 규칙의 몸이 들어맞는 경우에 핚하여 규칙의
결롞이 따라온다는 주장을 나타냄
35. 끝없는 루프
• 젃차적으로 해석하기 때문에 생길 수 있다.
• 엯역(deduction)하는 과정에서 시스템이
루프에 빠져 헤어나지 못함.
36. 끝없는 루프 - 예
(assert! (married Minnie Mickey))
(assert! (rule (married ?x ?y)
(married ?y ?x)))
• 일람표
– ?x Mickey (married Mickey ?who)
– ?y ?who
• 실행기가 규칙 몸 (married ?y ?x)를 처리
– (married ?who Mickey)
• 답 : DB 속의 참말
– (married Minnie Mickey)
• 다시 한번 married 규칙이 적용되어 규칙의 몸을 계산
– (married Mickey ?who)
37. not
(and (supervisor ?x ?y)
(not (job ?x (computer programmer))))
(and (not (job ?x (computer programmer)))
(supervisor ?x ?y))
• 같은 결과를 내지 않는다.
– 입력은 빈 일람표
– 빈 일람표에서 컴퓨터 프로그램을 걸러내면
결과로 빈 일람표를 내놓는다.
38. not의 차이
• 수학 논리의 not P
– P가 참이 아니다
• 쿼리 언어의 not P
– DB에서 P를 이끌어 내지 못한다.
• 쿼리 언어의 not은 닫힌 세계 가정(closed
world assuption)
– DB에 관련 정보가 모두 들어 있다는 사실을
바탕으로 핚다.