Програмиране на Пролог

68
Програмиране на Пролог Програмиране на Пролог доц. Светла Бойчева Факултет по математика и информатика СУ “Св. Климент Охридски”

Upload: cwen

Post on 21-Jan-2016

50 views

Category:

Documents


0 download

DESCRIPTION

Програмиране на Пролог. доц. Светла Бойчева Факултет по математика и информатика СУ “Св. Климент Охридски”. Съдържание на курса. Теоретични основи на езика Пролог. Основни понятия от предикатното смятане от първи ред. Клаузна форма. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Програмиране на Пролог

Програмиране на ПрологПрограмиране на Пролог

доц. Светла БойчеваФакултет по математика и информатикаСУ “Св. Климент Охридски”

Page 2: Програмиране на Пролог

Съдържание на курсаСъдържание на курса Теоретични основи на езика Пролог. Основни понятия от

предикатното смятане от първи ред. Клаузна форма. Метод на резолюцията. Пример. Унифициращ алгоритъм. Пример.

Преход към езика Пролог синтактични и семантични ограничения Въведение в програмирането на езика Пролог. Факти. Въпроси.

Променливи. Конюнкции. Правила. Механизъм за възврат. Рекурсия. Синтаксис и семантика на програмите

Синтаксис на езика Пролог. Информационни обекти. Символи. Термове (константи, променливи, структури). Съпоставяне на термове. Синтаксис на програма на Пролог

Запознаване със средата за програмиране SWI-Prolog Семантика. Декларативна семантика. Процедурна семантика. Списъци. Синтаксис. Семантика. Вътрешно представяне.

Унификация Основни операции над списъци: Проверка, дали елементът

принадлежи на списък. Конкатенация на списъци предикат append и прилагането му за разбиване на списък на части; за търсене на шаблон в списък. Включване на елемент в списък. Изключване на елемент от списък. Проверка, дали списък е подсписък на даден списък

Page 3: Програмиране на Пролог

Съдържание на курсаСъдържание на курса Оператори. Дефиниране на оператори. Отношения между

аритметични изрази. Събиране на полиноми Вградени предикати без странични ефекти. Определяне на типа на

терм. Управляващи предикати fail и !. Използване на !. Примери. Проблеми с !. Управляващи предикати true и repeat

Предикати за работа с БД (assert, retract, asserta, assertz). Примери

Вход и Изход. Работа с файлове Вградени предикати за работа с термове. Създаване и

декомпозиция на атоми. Вграден предикат name. Създаване и декомпозиране на термове (=.., functor, arg).

Стил на програмиране Практика на програмирането на Пролог. Операции над структури

от данни. Двоично дърво. Представяне. Основни операции: принадлежност на елемент в двоично дърво. Двоично наредено дърво. Принадлежност на елемент в двоично наредено дърво. Включване и изключване на елемент от двоично дърво

Графи. Логическо описание. Представяне. Търсене на ацикличен път в граф. Търсене на Хамилтонови цикли в граф. Търсене на пътища с определена стойност. Минимални и максимални пътища в граф

Page 4: Програмиране на Пролог

Аритметични изрази и Аритметични изрази и операториоператори

част 4

Page 5: Програмиране на Пролог
Page 6: Програмиране на Пролог

Аритметични изразиАритметични изрази

Аритметични операции+ - събиране- - изваждане* - умножение/ - деление// - целочислено делениеmod – остатък при целочислено деление** - повдигане на степен( )

Функцииabs(X) , sin(X), cos(X), sqrt(X), ...

Page 7: Програмиране на Пролог

Пресмятане на Пресмятане на аритметични изразиаритметични изрази

?- X is 5+sqrt(2).

?- Y=5, X is Y+1.

?- 5+6 =:= 3+8.

?- 5+6 =\= 4+6.

Page 8: Програмиране на Пролог

ЗадачаЗадача

Дефинирайте предикат за пресмятане по зададено X на стойността на функцията:

Page 9: Програмиране на Пролог

% I начинg(X,Result):- 0.5 < X , X =< 5, Result is log(X+3).g(X,Result):- -0.5 =< X, X =< 0.5, Result = -3.g(X,Result):- (X < -0.5 ; X >5), Result is sqrt(abs(12-X))+X*X.

% X**Y - X на степен Y% X**2 - X*X – sqr(X) – X на квадрат

Page 10: Програмиране на Пролог

% II начинg(X,Result):- 0.5 < X , X =< 5, !, Result is ln(X+3).g(X,Result):- -0.5 =< X, X =< 0.5, !, Result = -3.g(X,Result):- Result is sqrt(abs(12-X))+X*X.

% X**Y - X на степен Y% X**2 - X*X – sqr(X) – X на квадрат

Page 11: Програмиране на Пролог

ЗадачаЗадача

Дефинирайте предикат за пресмятане по зададено X на стойността на функцията:

Page 12: Програмиране на Пролог
Page 13: Програмиране на Пролог
Page 14: Програмиране на Пролог

fact(0,1).

fact(N,Result):-

M is N – 1,

fact(M,R),

Result is N*R.

Page 15: Програмиране на Пролог
Page 16: Програмиране на Пролог
Page 17: Програмиране на Пролог
Page 18: Програмиране на Пролог
Page 19: Програмиране на Пролог
Page 20: Програмиране на Пролог

% I начинfib(0,1).fib(1,1).fib(N,X):- N > 1, Prev is N - 1, PrevPrev is N - 2, fib(Prev, Y), fib(PrevPrev, Z), X is Y + Z.

Page 21: Програмиране на Пролог
Page 22: Програмиране на Пролог
Page 23: Програмиране на Пролог
Page 24: Програмиране на Пролог
Page 25: Програмиране на Пролог
Page 26: Програмиране на Пролог

pow(_,0,1).pow(X,N,Result):- N < 0, N1 is abs(N), pow(X,N1,R), Result is 1/R.pow(X,N,Result):- N > 0, N1 is N - 1, pow(X,N1,R), Result is X*R.

Page 27: Програмиране на Пролог

term(N,An):- fact(N,R), pow(5,N,T), An is R/T.

zad7(X,Nin, An, Nin):- term(Nin,An),An > X, !.

zad7(X,Nin, An, Nout):- Next is Nin + 1, zad7(X,Next, An, Nout).

Page 28: Програмиране на Пролог

Работа със списъциРабота със списъци

част 5

Page 29: Програмиране на Пролог
Page 30: Програмиране на Пролог

СписъциСписъци

[ ] – празен списък [ X | L ] – списък [ 1, 2, 3, 4, 5]

опашкаглава

Page 31: Програмиране на Пролог
Page 32: Програмиране на Пролог

ПримериПримери

[1, 2 ,3 ] = [1|[2,3]] =[1|[2|[3]]] [1]=[1|[ ]] [1,2]= [1|[2]]

Page 33: Програмиране на Пролог
Page 34: Програмиране на Пролог
Page 35: Програмиране на Пролог
Page 36: Програмиране на Пролог

Проверка за приндалежност Проверка за приндалежност на даден елемент на списъкна даден елемент на списък

% вграден

member(X,[X|_]).

member(X,[_|L]):- member(X,L).

Page 37: Програмиране на Пролог

| ?- member(1,[1,2,3]).yes

| ?- member(1,[4,1,2]). yes

| ?- member(X,[1,2,3]).X = 1 ? ;X = 2 ? ;X = 3 ? ;no

Page 38: Програмиране на Пролог

[a1, a2, a3, …, an] [b1, b2, b3, …, bm]

[a1, a2, a3, …, an, b1, b2, b3, …, bm]

[X | L1 ] L2

[X | [ a2, a3, …, an, b1, b2, b3, …, bm] ]

L1 L2

Page 39: Програмиране на Пролог

Слепване на списъциСлепване на списъци

% вграден

append([],L2,L2).

append([X|L1],L2,[X|L3]):- append(L1,L2,L3).

Page 40: Програмиране на Пролог

| ?- append([1,2],[3,4],X).

X = [1,2,3,4] ? ;

no

| ?- append(X,[2,3],[1,2,3]).

X = [1] ? ;

no

| ?- append([1,2],X,[1,2,3]).

X = [3] ? ;

no

Page 41: Програмиране на Пролог

| ?- 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

Page 42: Програмиране на Пролог

Дефиниции чрез Дефиниции чрез appendappend

member(X,L):-

append(_,[X|_],L).

[X | L2 ]L1

L

Page 43: Програмиране на Пролог

Дефиниции чрез Дефиниции чрез appendappend

del(X,L,Res):- append(L1,[X|L2],L), append(L1,L2,Res).

[X | L2 ]L1

L

Res

L2L1

Page 44: Програмиране на Пролог

Изтриване на първото Изтриване на първото срещане на елемент в срещане на елемент в

списъксписък

del(X,[X|L],L).

del(X,[Y|L],[Y|Res]):-

del(X,L,Res).

Page 45: Програмиране на Пролог

Изтриване на всички Изтриване на всички срещания на елемент в срещания на елемент в

списъксписъкdel_all(X,[],[]).

del_all(X,[X|L],Res):-

del_all(X,L,Res).

del_all(X,[Y|L],[Y|Res]):-

del_all(X,L,Res).

Page 46: Програмиране на Пролог

| ?- del(1,[1,2,3],L).

L = [2,3] ? ;

no

| ?- del(1,[1,2,1,3],L).

L = [2,1,3] ? ;

L = [1,2,3] ? ;

no

| ?- del_all(1,[1,2,1,3],L).

L = [2,3] ? ;

L = [2,1,3] ? ;

L = [1,2,3] ? ;

L = [1,2,1,3] ? ;

no

Page 47: Програмиране на Пролог

Изтриване на всички Изтриване на всички срещания на елемент в срещания на елемент в

списъксписъкdel_all(X,[],[]).

del_all(X,[X|L],Res):-

del_all(X,L,Res).

del_all(X,[Y|L],[Y|Res]):-

X \=Y, del_all(X,L,Res).

Page 48: Програмиране на Пролог

| ?- del_all(1,[1,2,1,3],L).

L = [2,3] ? ;

no

Page 49: Програмиране на Пролог

Дължина на списъкДължина на списък

% вграден

length([ ], 0).

length([X|L],N):-

length(L,M),

N is M+1.

Page 50: Програмиране на Пролог

ОтсичанеОтсичане

p:- a,b.

p:- c.

p (a&b) c

p:- a,!,b.

p:-c.

p (a&b) (~a&c)p:-a,b.

p:- not a,c. (p:- \+ a, c)

Page 51: Програмиране на Пролог

ОтсичанеОтсичане

p:- a,b,!,c,d.

p:- e.p

b

a

!

e

d

c

Page 52: Програмиране на Пролог

ПримерПример

max(X,Y,X):- X > Y.

max(X,Y,Y):- Y >= X.

max(X,Y,X):- X>Y,!.

max(X,Y,Y).

Page 53: Програмиране на Пролог

Пресмятане на сумата от Пресмятане на сумата от елементите на списък от елементите на списък от

числачислаsum([X],X).

sum([X|L],N):-

sum(L,M),

N is M+X.

?- sum([1,2,3],T).

T=6

Page 54: Програмиране на Пролог

nth([X|_],1,X).nth([_|L],N,X):- M is N-1, nth(L,M,X).

last([X],X).last([_|L],X):- last(L,X).

count([ ],_,0).count([X|L],X,N):- count(L,X,K), N is K+1.count([Y|L],X,N):- Y \= X, count(L,X,N).

Page 55: Програмиране на Пролог
Page 56: Програмиране на Пролог
Page 57: Програмиране на Пролог
Page 58: Програмиране на Пролог
Page 59: Програмиране на Пролог
Page 60: Програмиране на Пролог
Page 61: Програмиране на Пролог
Page 62: Програмиране на Пролог
Page 63: Програмиране на Пролог

init(_,[ ]).

init([X|Rest],[X|L]):-

init(Rest,L).

sublist(L,T):-

init(L,T).

sublist([_|Rest],T):-

sublist(Rest,T).

Page 64: Програмиране на Пролог

equal([ ],[ ]).

equal([X|Rest1], S2):-

del(X,S2,Rest2), !,

equal(Rest1,Rest2).

Page 65: Програмиране на Пролог
Page 66: Програмиране на Пролог
Page 67: Програмиране на Пролог
Page 68: Програмиране на Пролог