Prolog l Prolog SWIProlog l SWIProlog site http

  • Slides: 43
Download presentation

Prolog 설치 l 설치 Prolog ¨ SWI-Prolog l SWI-Prolog site ¨ http: //www. swi.

Prolog 설치 l 설치 Prolog ¨ SWI-Prolog l SWI-Prolog site ¨ http: //www. swi. psy. uva. nl/projects/SWI-Prolog/ l SWI-Prolog 설치 ¨ W 32 PL 5213 응용프로그램 아이콘을 누른다. ¨ 모든 물음 항목에 대해서 "OK"를 누른다. 4

사실 valuable(gold). ¨ 금은 귀중하다. female(jane). ¨ Jane은 여성이다. owns(john, gold). ¨ John이 금을

사실 valuable(gold). ¨ 금은 귀중하다. female(jane). ¨ Jane은 여성이다. owns(john, gold). ¨ John이 금을 소유하고 있다. father(john, mary). ¨ John은 Mary의 아버지이다. gives(john, book, mary). ¨ John이 Mary에게 책을 주었다. 8

질문 <예제 9> likes(joe, fish). likes(joe, mary). likes(mary, book). likes(john, book). ? - likes(joe,

질문 <예제 9> likes(joe, fish). likes(joe, mary). likes(mary, book). likes(john, book). ? - likes(joe, money). No ? - likes(mary, joe). No ? - likes(mary, book). Yes <예제 9>를 실행해 보자. 사실을 입력하고 다양한 질문을 하기 바 란다. 10

변수 <예제 10> likes(joe, fish). likes(mary, book). likes(mary, flower). ? - likes(joe, X). X

변수 <예제 10> likes(joe, fish). likes(mary, book). likes(mary, flower). ? - likes(joe, X). X = fish Yes ? - likes(mary, X). X = book ; X = flower ; No <예제 10>실행. 사실을 입력하고 다양한 질문을 하기 바란다. 12

논리곱 (2) <예제 11 -2> likes(mary, food). likes(mary, wine). likes(john, mary). likes(john, wine). ?

논리곱 (2) <예제 11 -2> likes(mary, food). likes(mary, wine). likes(john, mary). likes(john, wine). ? - likes(mary, john), likes(john, mary). No ? - likes(mary, X), likes(john, X). X = wine Yes <예제 11>실행. 사실을 입력하고 논리곱이 있는 질문을 하기 바 란다. 15

규칙 <예제 12> male(albert). male(edward). female(alice). female(victoria). parents(edward, victoria, albert). parents(alice, victoria, albert). sister_of(X,

규칙 <예제 12> male(albert). male(edward). female(alice). female(victoria). parents(edward, victoria, albert). parents(alice, victoria, albert). sister_of(X, Y) : - female(X), parents(X, M, F), parents(Y, M, F). ? - sister_of(alice, edward). Yes ? - sister_of(alice, X). X = edward Yes <예제 12>실행. 사실을 입력하고 논리곱이 있는 질문을 하기 바란다. 18

간단한 산술 연산 +(7, X) l A is B / 17 + C. l

간단한 산술 연산 +(7, X) l A is B / 17 + C. l Sum is Sum + Number. (유효하지 않음) l 예 add_em_up(X, Y, Sum): - Sum is X+Y. multiply_em(X, Y, Product): - Product is X*Y. l 질의 add_em_up(35, 24, Sum). 결과 Sum = 59 19

가족 관계 탐색 <예제 13 -1> male(albert). male(edward). female(alice). female(victoria). parents(edward, victoria, albert). parents(alice,

가족 관계 탐색 <예제 13 -1> male(albert). male(edward). female(alice). female(victoria). parents(edward, victoria, albert). parents(alice, victoria, albert). sister_of(X, Y) : - female(X), parents(X, M, F), parents(Y, M, F). l 가족 관계를 나타내는 다양한 규칙을 만들어 보라. 21

가족 관계 탐색 <예제 13 -3> father(cheolsu, youngduk). /* 사실 */ father(youngsu, youngduk). father(youngduk,

가족 관계 탐색 <예제 13 -3> father(cheolsu, youngduk). /* 사실 */ father(youngsu, youngduk). father(youngduk, youngho). father(hoduk, youngho). father(minhee, youngmin). father(minyoung, youngmin). mother(younghee, minhee). mother(youngsun, minhee). male(cheolsu). male(youngduk). male(hoduk). male(youngho). male(youngmin). male(minyoung). female(younghee). female(minhee). female(youngsun). parents(M, X, Y): -father(M, X), /* 규칙*/ mother(M, Y). parent(M, Y) : - father(M, Y). brother(X, Y): -male(Y), father(X, P), father(Y, P), X<>Y. sister(X, Y): -female(Y), father(X, P), father(Y, P), X<>Y. uncle(X, Y): -father(X, P), brother(P, Y). uncle(X, Y): -mother(X, P), brother(P, Y). grandfather(X, Y): -father(X, P), father(P, Y). grandmother(X, Y): -mother(X, P), father(P, Y). * 누가 누구의 할아버지인가? 질의 사용 22

삼단 논법 <예제 14> man(socrates). mortal(X) : - man(X). l 다양한 삼단 논법을 작성하여

삼단 논법 <예제 14> man(socrates). mortal(X) : - man(X). l 다양한 삼단 논법을 작성하여 보아라. [참고문헌] W. F. Clocksin, C. S. Mellish, Programming in Prolog, Springer-Verlag, 1981 23

백트랙킹 <예제 15 -1> turbo-prolog syntax predicates boy(symbol) girl(symbol) possible_pair(symbol, symbol) clauses boy(john). boy(mark).

백트랙킹 <예제 15 -1> turbo-prolog syntax predicates boy(symbol) girl(symbol) possible_pair(symbol, symbol) clauses boy(john). boy(mark). boy(ted). boy(andy). girl(sandy). girl(alice). girl(mary). possible_pair(X, Y) : - boy(X), girl(Y). goal possible_pair(X, Y). 25

백트랙킹 <예제 15 -2> predicates boss(symbol, symbol) clauses boss(dick, harry). boss(tom, dick). boss(ann, mary).

백트랙킹 <예제 15 -2> predicates boss(symbol, symbol) clauses boss(dick, harry). boss(tom, dick). boss(ann, mary). boss(mary, harry). goal boss(X, Y), boss(Y, Z). X = tom, Y = dick, Z= harry X = ann, Y = mary, Z = harry 2 Solutions 26

백트랙킹 Backtracking with rules <예제 15 -3> l clauses department(tom, sales). department(harry, production). manager(dick,

백트랙킹 Backtracking with rules <예제 15 -3> l clauses department(tom, sales). department(harry, production). manager(dick, sales). manager(mary, production). boss(B, E) : - department(E, D), manager(B, D). goal boss(X, Y). X= dick Y= tom X = mary Y = harry 2 Solutions c. f. ) !을 포함하는 경우 boss(B, E) : - department(E, D), manager(B, D), !. 27

컷(cut)과 fail <예제 16 -1> predicates temperature(integer, symbol) clauses temperature(X, normal) : - X

컷(cut)과 fail <예제 16 -1> predicates temperature(integer, symbol) clauses temperature(X, normal) : - X <= 25. temperature(X, warm) : - X < 30. temperature(X, warning) : - X > 35. goal temperature(20, Y). Y = normal Y = warm 2 Solutions 29

컷(cut)과 fail * cut(!)을 삽입한 경우 : temperature(X, normal) : - X <= 25,

컷(cut)과 fail * cut(!)을 삽입한 경우 : temperature(X, normal) : - X <= 25, ! goal temperature(20, Y). Y = normal 1 Solution 30

컷(cut)과 fail <예제 16 -2> domains name = symbol predicates father( name, name) everybody

컷(cut)과 fail <예제 16 -2> domains name = symbol predicates father( name, name) everybody clauses father(leonard, katherine). father( carl, jason). father(carl, marilyn). everybody : father(X, Y), write(X), write(' is '), write(Y), write(' ''s father. '), nl, fail. goal everybody. leonard is katherine’s father. carl is jason’s father. carl is marilyn’s father. * fail이 없는 경우 goal everybody. leonard is katherine’s father * 부목표가 없는 경우(자동 으로 backtracking) goal father(X, Y). X = leonard, Y = Katherine X = carl, Y = jason X = carl, Y = marilyn 32

재귀적 구조 l 규칙의 머리가 같은 규칙의 몸체에도 나타나는 구조 <예제 17 -1> predicates

재귀적 구조 l 규칙의 머리가 같은 규칙의 몸체에도 나타나는 구조 <예제 17 -1> predicates sum_to(integer, integer) clauses sum_to(1, 1) : - !. sum_to (N, Res) : - N 1 = N-1, sum_to (N 1, Res 1), Res = Res 1+N. goal sum_to (5, X). X = 15 33

선택구조 l CASE나 IF-THEN-ELSE와 비슷한 기능을 갖는 program <예제 18> predicates classify(integer, symbol) clauses

선택구조 l CASE나 IF-THEN-ELSE와 비슷한 기능을 갖는 program <예제 18> predicates classify(integer, symbol) clauses classify(0, zero). classify(X, negative) : - X < 0. classify(X, positive) : - X > 0. goal classify(5, What). What = positive. 1 Solution 34

재귀적 구조 <예제 17 -2> predicates factorial(integer, integer) clauses factorial(1, 1). factorial(N, A) :

재귀적 구조 <예제 17 -2> predicates factorial(integer, integer) clauses factorial(1, 1). factorial(N, A) : N 1 = N-1, factorial(N 1, A 1), A = N * A 1. goal factorial(5, X). X = 120 35

리스트 l 리스트의 기본 술어 (1) 리스트의 생성 <예제 19 -1> domains list =

리스트 l 리스트의 기본 술어 (1) 리스트의 생성 <예제 19 -1> domains list = integer* predicates make_list(integer, list) clauses make_list(Head, List, [Head|List]). goal make_list(1, [2, 3], New_list). New_list = [1, 2, 3] 37

리스트 (2) 리스트의 결합 <예제 19 -2> domains list = symbol* predicates append(list, list)

리스트 (2) 리스트의 결합 <예제 19 -2> domains list = symbol* predicates append(list, list) clauses append([ ], L, L). append([X|L 1], L 2, [X|L 3]) : - append(L 1, L 2, L 3). goal append([a, b, c], [d, e, f], L). L =[“a”, “b”, “c”, “d”, “e”, “f”] 38

리스트 (3) 리스트의 반전 <예제 19 -3> domains list = symbol* predicates reverse(list, list)

리스트 (3) 리스트의 반전 <예제 19 -3> domains list = symbol* predicates reverse(list, list) reverse 1(list, list) clauses reverse(L 1, L 2) : - reverse 1(L 1, [ ], L 2). reverse 1([ ], L, L). reverse 1([X|L 1], L 2, L 3) : - reverse 1(L 1, [X| L 2], L 3). goal reverse([a, b, c, d], L). L = [d, c, b, a] 39

리스트 (4) 구성요소의 확인 <예제 19 -4> domains list = symbol* predicates member(symbol, list)

리스트 (4) 구성요소의 확인 <예제 19 -4> domains list = symbol* predicates member(symbol, list) clauses member(X, [X| _ ]). member(X, [ _ |Y]) : - member(X, Y). goal member(d, [a, b, c, d, e]). goal member(2, [3, a, 4, f]). yes no 40

리스트 (5) 리스트 선두에 추가 <예제 19 -5> domains list = symbol* predicates cons(symbol,

리스트 (5) 리스트 선두에 추가 <예제 19 -5> domains list = symbol* predicates cons(symbol, list) clauses cons(X, L, [X | L]). goal cons(a, [b, c, d, e], L). L = [a, b, c, d, e] 41

리스트 (6) 리스트의 마지막 항 검색 <예제 19 -6> domains list = symbol* predicates

리스트 (6) 리스트의 마지막 항 검색 <예제 19 -6> domains list = symbol* predicates last(symbol, list) clauses last(X, [X]). last(X, [ _ | Y|]) : - last(X, Y). goal last(X, [talk, of, the, town]). town 42