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

1,259
-1

Published on

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,259
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
6
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

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

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

×