[SICP] 4.4 Logic Programming : 논리로 프로그램 짜기

40
4.4 Logic Programming 논리로 프로그램 짜기 http://ohyecloudy.com http://cafe.naver.com/architect1.cafe 2009.03.28

Transcript of [SICP] 4.4 Logic Programming : 논리로 프로그램 짜기

Page 1: [SICP] 4.4 Logic Programming : 논리로 프로그램 짜기

4.4 Logic Programming 논리로 프로그램 짜기

http://ohyecloudy.com

http://cafe.naver.com/architect1.cafe

2009.03.28

Page 2: [SICP] 4.4 Logic Programming : 논리로 프로그램 짜기

관계로 프로그램을 짜기

• 계산

– 값 하나를 나타내는 함수가 아니라 여러 값 사이의 관계를 다루는 것을 뜻함.

• 비 결정적 언어

– 식 하나가 여러 값을 나타낼 수 있다.

Page 3: [SICP] 4.4 Logic Programming : 논리로 프로그램 짜기

논리 중심 프로그래밍 언어

• 관계로 프로그래밍 짜기

• + 동일화(unification)

– 기호 패턴 매칭(symbolic pattern matching)의 핚 기법

– 훨씬 편리하고 뛰어난 표현력 제공

Page 4: [SICP] 4.4 Logic Programming : 논리로 프로그램 짜기

예제 – APPEND 연산

• 규칙

– 리스트 y가 있을 때, 비어 있는 리스트와 y를 append하면 y가 된다.

– u,v,y,z가 있을 때, (cons u v)와 y를 append하면 (cons u z)가 된다. 여기서 z는 v와 y를 append핚 것이다.

Page 5: [SICP] 4.4 Logic Programming : 논리로 프로그램 짜기

프로시저 중심 언어

(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 연산의 규칙을 따르면 답할 수 있는 문제.

Page 6: [SICP] 4.4 Logic Programming : 논리로 프로그램 짜기

논리 프로그래밍 언어

• 규칙만 정의

– 리스트 y가 있을 때, 비어 있는 리스트와 y를 append하면 y가 된다.

– u,v,y,z가 있을 때, (cons u v)와 y를 append하면 (cons u z)가 된다. 여기서 z는 v와 y를 append핚 것이다.

• 어떻게(how to)는 실행기가 알아서

Page 7: [SICP] 4.4 Logic Programming : 논리로 프로그램 짜기

쿼리 언어?

• == 논리 프로그래밍 언어.

• DB에서 필요핚 정보를 뽑아내는 질문(쿼리)을 언어 형태로 정형화.

• 쿼리를 정의 : 무엇을(what is)

• DB 시스템에서 어떻게(how to)를 알아서 해준다.

Page 8: [SICP] 4.4 Logic Programming : 논리로 프로그램 짜기

4.4.1 연역식 정보 찾기

Page 9: [SICP] 4.4 Logic Programming : 논리로 프로그램 짜기

간단한 DB

• 참말(assertion, 단정문)들의 집합.

(address (Bitdiddle Ben) (Slumerville (Ridge Road) 10)) (job (Bitdiddle Ben) (computer wizard)) (salary (Bitdiddle Ben) 60000) (address (Hacker Alyssa P) (Cambridge (Mass Ave) 78)) (job (Hacker Alyssa P) (computer programmer)) (salary (Hacker Alyssa P) 40000) (supervisor (Hacker Alyssa P) (Bitdiddle Ben))

Page 10: [SICP] 4.4 Logic Programming : 논리로 프로그램 짜기

간단한 쿼리

패턴 변수 (pattern variable)

• ?x

• 아무거나 와도 된다는 것을 나타냄

• ?만 써도 될 것 같은데… – 같은 패턴 변수인지를 구분하는 용도

;;; Query input: (job ?x (computer programmer)) ;;; Query results: (job (Hacker Alyssa P) (computer programmer)) (job (Fect Cy D) (computer programmer))

Page 11: [SICP] 4.4 Logic Programming : 논리로 프로그램 짜기

합친 쿼리

• 쿼리 언어를 엮어내는 수단

– and, or, not

– Lisp 기본 연산이 아니라 쿼리 언어에 들어가는 붙박이 연산.

(and (job ?person (computer programmer)) (address ?person ?where)) (or (supervisor ?x (Bitdiddle Ben)) (supervisor ?x (Hacker Alyssa P))) (not (job ?x (computer programmer)))

Page 12: [SICP] 4.4 Logic Programming : 논리로 프로그램 짜기

규칙(rule)

• 쿼리 언어에서 쿼리를 요약하는(간추리는)수단.

– <conclusion> : 패턴

– <body> : 쿼리

(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))))

(rule <conclusion> <body>)

Page 13: [SICP] 4.4 Logic Programming : 논리로 프로그램 짜기

규칙의 결과

• 규칙 결과는 참말(assertion)의 집합

• 규칙의 몸(쿼리)을 만족하도록 변수를 값으로 맞바꾸어서 찍어낼 수 있는 모든 규칙의 결과(패턴)

;; query (lives-near ?x (Bitdiddle Ben)) ;; result (lives-near (Reasoner Louis) (Bitdiddle Ben)) (lives-near (Aull DeWitt) (Bitdiddle Ben))

Page 14: [SICP] 4.4 Logic Programming : 논리로 프로그램 짜기

프로그램으로서의 논리

• 규칙에 바탕을 두고 논리에 따라 엯역식 추론(logical deduction)

– 연역법(deduction) : 이미 증명된 명제를 젂제로 새로운 명제를 결롞으로 이끌어 낸다.

– 규칙의 몸(쿼리)을 만족하도록 패턴 변수에 값을 집어넣고 이 방법으로 결롞을 만족시킴.

Page 15: [SICP] 4.4 Logic Programming : 논리로 프로그램 짜기

예제 – APPEND 연산

• 규칙만 정의.

• 어떻게(how to)는 실행기가 알아서 해줌.

(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한 것이다.

Page 16: [SICP] 4.4 Logic Programming : 논리로 프로그램 짜기

예제 – 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))

Page 17: [SICP] 4.4 Logic Programming : 논리로 프로그램 짜기

4.4.2 쿼리 시스템의 동작 방식

Page 18: [SICP] 4.4 Logic Programming : 논리로 프로그램 짜기

쿼리 시스템

• 패턴 매칭 (pattern matching)

– 일람표(frame)의 스트림으로 구성된 정보로 쿼리를 구현

• 동일화 (unification)

– 패턴 매칭을 일반화핚 기법

Page 19: [SICP] 4.4 Logic Programming : 논리로 프로그램 짜기

패턴 매처(pattern matcher)

데이터

패턴

변수 일람표

패턴 변수

데이터를 패턴에 맞출 수 있나?

패턴 변수

OK! 그 과정에서 정의된 놈을 넣는다.

변수 일람표를 값으로 내놓는다.

NO! 맞추지 못핚다고 알린다.

1

2-a

2-b

3

Page 20: [SICP] 4.4 Logic Programming : 논리로 프로그램 짜기

빈 일람표에서 시작. 성공

데이터

패턴

변수 일람표 (a b a)

(?x ?y ?x)

?x : a ?y : b

변수 일람표를 값으로 내놓는다.

Page 21: [SICP] 4.4 Logic Programming : 논리로 프로그램 짜기

일람표 변수 사용. 실패

데이터

패턴

변수 일람표

(a b a)

(?x ?y ?x)

?y : a

NO! 맞추지 못핚다고 알린다.

Page 22: [SICP] 4.4 Logic Programming : 논리로 프로그램 짜기

변수 일람표에 추가. 성공

데이터

패턴

변수 일람표

(a b a)

(?x ?y ?x)

?y : b

?x : a

변수 일람표를 값으로 내놓는다.

Page 23: [SICP] 4.4 Logic Programming : 논리로 프로그램 짜기

변수 일람표들의 스트림

쿼리 ( job ?x ?y)

일람표들의 입력 스트림

일람표들의 출력 스트림

DB 속에 있는 참말(assertion)들의 스트림

Page 24: [SICP] 4.4 Logic Programming : 논리로 프로그램 짜기

변수 일람표들의 스트림

쿼리 ( job ?x ?y)

변수 일람표 변수 일람표

?x : a

패턴

데이터

?x : a ?x : a

Page 25: [SICP] 4.4 Logic Programming : 논리로 프로그램 짜기

동일화(unification)

• 결롞이 정해진 쿼리 패턴과 맞아떨어지는 규칙만 찾을 수 있어야 핚다.

• 규칙의 결론에 변수가 들어갈 수 있기 때문에 그에 맞추어 패턴 매칭 기능을 늘릴 필요가 있다.

• ‘패턴’과 ‘데이터’ 모두 변수를 가질 수 있다.

Page 26: [SICP] 4.4 Logic Programming : 논리로 프로그램 짜기

동일화 함수(unifier)

패턴 패턴

상수

변수

변수 상수

변수 자리에 알맞은 값을 넣어서 패턴을 같게 만들 수 있는지 판단 변수 일람표

?x : a ?x : a

?x : a MAKE!

Page 27: [SICP] 4.4 Logic Programming : 논리로 프로그램 짜기

동일화 함수(unifier) 동작 예-1

(?y ?z a)

패턴

(?x a ?y)

패턴

?x : a ?y : a ?z : a

변수 일람표

MAKE!

Page 28: [SICP] 4.4 Logic Programming : 논리로 프로그램 짜기

동일화 함수(unifier) 동작 예-2

((b ?y) ?z)

패턴

(?x a)

패턴

?x : (b ?y) ?y :

?z : a

변수 일람표

MAKE!

Page 29: [SICP] 4.4 Logic Programming : 논리로 프로그램 짜기

규칙 적용하기

• 일람표 – ?person-2 Hacker Alyssa P – ?x ?person-1

• 쿼리를 처리 • 매칭이 성공으로 끝나면 패턴 매처가 내 놓은 일람표

에 ?person-1 정의가 있고 이게 ?x 값이다. • 이 값을 쿼리 패턴에서 데이터로 찍어낸다.

(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))))

Page 30: [SICP] 4.4 Logic Programming : 논리로 프로그램 짜기

Lisp : eval/apply 실행기와 비교

• 쿼리 실행기 – 쿼리를 규칙의 결롞에 동일화하는 일이 성공으로

끝나면, 그에 맞추어 처음에 받았던 일람표에 알맞은 정보를 보탠다.

– 그렇게 확장된 일람표를 맞추어 규칙의 몸을 구성하는 쿼리를 처리핚다.

• eval/apply 실행기 – 프로시저의 매개변수를 받아온 인자 값으로 정의

하여, 처음 프로시저 홖경을 확장한 일람표를 구성핚다.

– 확장된 홖경에 맞추어 프로시저의 몸을 이루는 식의 값을 구한다.

Page 31: [SICP] 4.4 Logic Programming : 논리로 프로그램 짜기

규칙을 적용한 간단한 쿼리

• 생성하는 스트림 1. 패턴 매처를 가지고 DB에 있는 모든 참말에

패턴을 맞추어 보는 과정에서 확장된 일람표의 스트림

2. 동일화 함수를 가지고 쓸 수 있는 모든 규칙을 적용하는 과정에서 확장된 일람표의 스트림

• 이 두 스트림을 붙여서 하나의 스트림을 만든다.

Page 32: [SICP] 4.4 Logic Programming : 논리로 프로그램 짜기

쿼리 실행기와 드라이버 루프

• 쿼리 실행기 : qeval – Lisp의 eval 프로시저와 비슷 – 인자 : 쿼리 하나와 일람표 스트림 하나 – 출력 : 일람표 스트림

• 드라이버 루프 – 터미널(terminal)에서 쿼리를 읽는다. – 읽을 때마다 쿼리와 빈 일람표를 qeval에 인자로 넘긴다.

– qeval 출력 일람표로 터미널로부터 읽은 쿼리에서 데이터를 찍어낸다.

Page 33: [SICP] 4.4 Logic Programming : 논리로 프로그램 짜기

4.4.3 논리 프로그래밍은 수학 논리를 따르는가

Page 34: [SICP] 4.4 Logic Programming : 논리로 프로그램 짜기

수학 논리를 따르는가?

• 수학 논리에서 절차대로 해석할 수 있는 부분 집합을 빌어다 쓴다.

• 참말(assertion) : 씨 명제(atomic proposition)

• 규칙(rule) : 함의(implication)

– 규칙의 몸이 들어맞는 경우에 핚하여 규칙의 결롞이 따라온다는 주장을 나타냄

Page 35: [SICP] 4.4 Logic Programming : 논리로 프로그램 짜기

끝없는 루프

• 젃차적으로 해석하기 때문에 생길 수 있다.

• 엯역(deduction)하는 과정에서 시스템이 루프에 빠져 헤어나지 못함.

Page 36: [SICP] 4.4 Logic Programming : 논리로 프로그램 짜기

끝없는 루프 - 예

• 일람표 – ?x Mickey – ?y ?who

• 실행기가 규칙 몸 (married ?y ?x)를 처리 – (married ?who Mickey)

• 답 : DB 속의 참말 – (married Minnie Mickey)

• 다시 한번 married 규칙이 적용되어 규칙의 몸을 계산 – (married Mickey ?who)

(assert! (married Minnie Mickey)) (assert! (rule (married ?x ?y) (married ?y ?x))) (married Mickey ?who)

Page 37: [SICP] 4.4 Logic Programming : 논리로 프로그램 짜기

not

• 같은 결과를 내지 않는다.

–입력은 빈 일람표

– 빈 일람표에서 컴퓨터 프로그램을 걸러내면 결과로 빈 일람표를 내놓는다.

(and (supervisor ?x ?y) (not (job ?x (computer programmer)))) (and (not (job ?x (computer programmer))) (supervisor ?x ?y))

Page 38: [SICP] 4.4 Logic Programming : 논리로 프로그램 짜기

not의 차이

• 수학 논리의 not P – P가 참이 아니다

• 쿼리 언어의 not P – DB에서 P를 이끌어 내지 못한다.

• 쿼리 언어의 not은 닫힌 세계 가정(closed world assuption) – DB에 관련 정보가 모두 들어 있다는 사실을

바탕으로 핚다.

Page 39: [SICP] 4.4 Logic Programming : 논리로 프로그램 짜기

4.4.4 쿼리 시스템 만들기

Page 40: [SICP] 4.4 Logic Programming : 논리로 프로그램 짜기