2005. 인공지능 PROLOG Yonsei Univ. 인공지능
목차 Prolog 소개 Terms Constants, Variables, Compound Terms 기본문 Facts, Rules SWI-Prolog Operators Lists findall, bagof, setof Problem solving 숙제 인공지능
Prolog 소개 1970년대 초에 프랑스 마르세유 대학의 콜메로에(A. Colmerauer)가 제안한 인공지능 언어 Programming in Logic : 논리적인 문제에 적합 (전문가 시스템, 자연어 처리 등) 선언적 언어(Declarative Language) : 사실(Facts)과 규칙(Rules): 입력과 출력 사이의 관계를 묘사 Terms Constants (integers, real numbers, atoms) Variables Compound Terms 인공지능
Constants Terms Integer constants(정수) : 1, 2, 3, … Real constants(실수) : 1.23, … Atom(원자) : 알파벳, 숫자, 특수문자로 구성 소문자 알파벳으로 시작 ex) john, book, mjk0206, … 특수문자로만 구성 ex) *, ., =, @#$, … 인용부호(‘ ’)를 이용하여사용가능 ex) ‘george-smith’ Atom은 Variable이 아님 : not bound to anything, never equal to anything else (string constants에 더 가까움) 인공지능
Variables Terms 일반적인 대상을 대표하는 것, 값이 할당되지 않은 개체 대문자 혹은 밑줄(_)로 시작 ex) X, Child, Gross_Pay, _3_blind_mice 익명변수(anonymous variable) 실제 프로그램의 수행에는 사용하지 않지만 프로그램의 작성에는 필요할 경우 사용 ‘_’로 표시 ex) ?-likes(_,mary). 인공지능
Compound Terms Terms 구성 성분 혹은 요소(Component)들을 모아 단일 대상으로 나타냄 Structured data라고 생각하면 됨 함수(술어)와 요소(구성 성분)에 의해 기술 structure-name ( attribute, ..., attribute ) Ex) 자동차를 표현하는 예 Maker, Age, Price 의 3가지 특성 포함 car(ford, 3, 5000) 활용 예 has(joe, car(toyota,5,1000)). has(mick, car(ford,2,2000)). ?- has(mick, car(ford,Age,Price)) Age와 Price는 변수이므로 첫 글자가 대문자! Answer: Age=2, Price=2000 인공지능
기본문 기본문의 구성 (Facts, Rules, Questions) Facts 객체간의 성립 관계를 기술(‘.’ 로 종료) 관계이름(객체, 객체, …). female(jane). parent(kim,holly). Rules 어떤 사실이 다른 사실들의 모임에 의존할 때 사용 (‘.’ 로 종료) 결론부(head):-조건부(conditions). 조건이 여러 개일 경우 and(,) / or(;)로 연결 greatgrandparent(GGP,GGC) :- parent(GGP,GP), parent(GP,P), parent(P,GGC). 인공지능
Rules 재귀적 Rules 다른 Rules를 사용한 Rules ancestor(X,Y) :- parent(X,Y). ancestor(X,Y) :- parent(Z,Y), ancestor(X,Z). grandparent(GP,GC) :- parent(GP,P), parent(P,GC). greatgrandparent(GGP,GGC) :- grandparent(GGP,P), parent(P,GGC). 인공지능
SWI-Prolog Prompting for a query with ‘?-’ 질문, 결과출력 의 반복 수행 Welcome to SWI-Prolog (Multi-threaded, Version 5.4.7) Copyright (c) 1990-2003 University of Amsterdam. SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it under certain conditions. Please visit http://www.swi-prolog.org for details. For help, use ?- help(Topic). or ?- apropos(Word). ?- Prompting for a query with ‘?-’ 질문, 결과출력 의 반복 수행 인공지능
relations.pl SWI-Prolog parent(kim,holly). /* comment */ parent(margaret,kim). % comment parent(margaret,kent). parent(esther,margaret). parent(herbert,margaret). parent(herbert,jean). greatgrandparent(GGP,GGC) :- parent(GGP,GP), parent(GP,P), parent(P,GGC). 인공지능
Interpreter의 사용 SWI-Prolog 파일 읽기 간단한 질문 ?- consult(relations). % relations compiled 0.00 sec, 1,420 bytes Yes ?- ?- ['relations']. % relations compiled 0.00 sec, 1,420 bytes Yes ?- ?- parent(margaret,kent). Yes ?- 인공지능
변수를 이용한 질문 SWI-Prolog 변수는 질문의 어떤 위치에도 나올 수 있음 parent(Parent,jean) parent(esther,Child) ‘Enter’ 대신에 ‘;’를 입력하여 Prolog system에게 추가 답을 요청 질문을 ‘,’로 결합가능 parent(margaret,X), parent(X,holly). ?- parent(margaret,Child). Child = kim ; Child = kent ; No ?- ?- parent(margaret,Child). Child = kim Yes ?- 사용자의 입력을 기다림. 인공지능
Rule을 이용한 질문 SWI-Prolog greatgrandparent(esther,GreatGrandchild) ?- greatgrandparent(esther,GrateGrandchild). GrateGrandchild = holly Yes ?- greatgrandparent(esther,GreatGrandchild) GGP는 esther, GGC는 GreatGrandChild parent(esther,GP), parent(GP,P), parent(P,GreatGrandchild) GP는 margaret parent(margaret,P), parent(P,GreatGrandchild) P는 kim parent(kim,GreatGrandchild) GreatGrandchild는 holly 인공지능
Operators +(1,*(2,3)), 1+ *(2,3), +(1,2*3), (1+(2*3)), 1+2*3 는 모두 같은 의미 ‘7’ 이 아님 ‘is’ 가 term 을 평가(evaluate) ?- X = 1+2*3. X = 1+2*3. Yes ?- Y=X+2, X=1. Y = 1+2 X = 1 Yes ?- X=1, Y is X+2. X = 1 Y = 3 Yes 인공지능
Lists List notation Term denoted ‘[ ]’ 는 empty list를 의미 ‘|’ 기호 뒤의 term은 Tail 을 의미 [1,2|X] = [1,2,3,4,5]. 는 1,2로 시작하는 list의 tail을 x로 bind List notation Term denoted [] [1] .(1,[]) [1,2,3] .(1,.(2,.(3,[]))) [1,parent(X,Y)] .(1,.(parent(X,Y),[])) [1|X] .(1,X) [1,2|X] .(1,.(2,X))) [1,2|[3,4]] same as [1,2,3,4] 인공지능
List Predicates Lists append(X,Y,Z) member(X,Y) List Y가 X를 포함하는지 확인 ?- append(X,Y,[1,2,3]). X = [] Y = [1, 2, 3] ; X = [1] Y = [2, 3] ; X = [1, 2] Y = [3] ; X = [1, 2, 3] Y = [] ; No ?- append([1,2],[3,4],Z). Z = [1, 2, 3, 4] Yes ?- append(X,[3,4],[1,2,3,4]). X = [1, 2] Yes 인공지능
findall, bagof, setof parent(john,peter). parent(john,paul). ?-findall(C,parent(john,C),L). L = [peter,paul,mary] ?-findall(C,parent(P,C),L). L = [peter,paul,mary,davy,dee,dozy] ?-bagof(C,parent(P,C),L). P = john L = [peter,paul,mary]; P = mick L = [davy,dee,dozy] setof/3 : bagof/3 과 비슷하지만 결과를 중복없이 sort해서 보여줌 parent(john,peter). parent(john,paul). parent(john,mary). parent(mick,davy). parent(mick,dee). parent(mick,dozy). ?-bagof(C,P^parent(P,C),L). L = [peter,paul,mary,davy,dee,dozy] 인공지능
Problem solving (predicate) Prolog의 주된 control structure 는 recursion 예) partition/4 predicate: partition(L,N,Littles,Bigs) Step 1. declarative specification % partition(L,N,Littles,Bigs) % list L중에서 N보다 작은수는 Littles에, 큰 수는 Bigs에 포함 Step 2. recursion과 출력 arguments를 identify (코드 골격 작성) partition([ ],N,[ ],[ ]). partition([Head|Tail],N,?Littles,?Bigs):- /* do something with Head */ partition(Tail,N,Littles,Bigs). 인공지능
Problem solving (predicate) (cont.) Step 3. 코드 body 작성 partition([],N,[],[]). partition([Head|Tail],N,?Littles,?Bigs):- Head < N, partition(Tail,N,Littles,Bigs), ?Littles = [Head|Littles],?Bigs = Bigs. Head >= N, partition(Tail,N,Littles,Bigs), ?Littles = Littles,?Bigs = [Head |Bigs]. Step 4. 출력 argument 채우기 partition([Head|Tail],N,[Head|Littles],Bigs):- Head < N, partition(Tail,N,Littles,Bigs). partition([Head|Tail],N,Littles,[Head|Bigs]):- Head >= N, partition(Tail,N,Littles,Bigs). 인공지능
숙제 Tom Nicole Arnold Kitty Michael Nick Ann Julia Mike Jack Sue 위의 가계도를 보고 male, female, father, mother의 fact를 작성하고, 이를 이용하여 다음 predicate을 구현하시오. 1. brother_and_sister(X,Y). %X, Y는 남매인가? 2. grandparent(X,Y). %X는 Y의 조부모(혹은 외조부모)인가? 3. ancestor(X,Y). %X는 Y의 조상인가? 인공지능