690 likes | 850 Views
Програмиране на Пролог. доц. Светла Бойчева Факултет по математика и информатика СУ “Св. Климент Охридски”. Съдържание на курса. Теоретични основи на езика Пролог. Основни понятия от предикатното смятане от първи ред. Клаузна форма.
E N D
Програмиране на Пролог доц. Светла Бойчева Факултет по математика и информатика СУ “Св. Климент Охридски”
Съдържание на курса • Теоретични основи на езика Пролог. Основни понятия от предикатното смятане от първи ред. Клаузна форма. • Метод на резолюцията. Пример. Унифициращ алгоритъм. Пример. Преход към езика Пролог синтактични и семантични ограничения • Въведение в програмирането на езика Пролог. Факти. Въпроси. Променливи. Конюнкции. Правила. Механизъм за възврат. Рекурсия.Синтаксис и семантика на програмите • Синтаксис на езика Пролог. Информационни обекти. Символи. Термове (константи, променливи, структури). Съпоставяне на термове. Синтаксис на програма на Пролог • Запознаване със средата за програмиране SWI-Prolog • Семантика. Декларативна семантика. Процедурна семантика. • Списъци. Синтаксис. Семантика. Вътрешно представяне. Унификация • Основни операции над списъци: Проверка, дали елементът принадлежи на списък. Конкатенация на списъци предикат append и прилагането му за разбиване на списък на части; за търсене на шаблон в списък. Включване на елемент в списък. Изключване на елемент от списък. Проверка, дали списък е подсписък на даден списък
Съдържание на курса • Оператори. Дефиниране на оператори. Отношения между аритметични изрази. Събиране на полиноми • Вградени предикати без странични ефекти. Определяне на типа на терм. Управляващи предикати fail и !. Използване на !. Примери. Проблеми с !. Управляващи предикати true и repeat • Предикати за работа с БД (assert, retract, asserta, assertz). Примери • Вход и Изход. Работа с файлове • Вградени предикати за работа с термове. Създаване и декомпозиция на атоми. Вграден предикат name. Създаване и декомпозиране на термове (=.., functor, arg). • Стил на програмиране • Практика на програмирането на Пролог. Операции над структури от данни. Двоично дърво. Представяне. Основни операции: принадлежност на елемент в двоично дърво. Двоично наредено дърво. Принадлежност на елемент в двоично наредено дърво. Включване и изключване на елемент от двоично дърво • Графи. Логическо описание. Представяне. Търсене на ацикличен път в граф. Търсене на Хамилтонови цикли в граф. Търсене на пътища с определена стойност. Минимални и максимални пътища в граф
Аритметични изрази Аритметични операции + - събиране - - изваждане * - умножение / - деление // - целочислено деление mod – остатък при целочислено деление ** - повдигане на степен ( ) Функции abs(X) , sin(X), cos(X), sqrt(X), ...
Пресмятане на аритметични изрази ?- X is 5+sqrt(2). ?- Y=5, X is Y+1. ?- 5+6 =:= 3+8. ?- 5+6 =\= 4+6.
Задача • Дефинирайте предикат за пресмятане по зададено X на стойността на функцията:
% 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 на квадрат
% 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 на квадрат
Задача • Дефинирайте предикат за пресмятане по зададено X на стойността на функцията:
fact(0,1). fact(N,Result):- M is N – 1, fact(M,R), Result is N*R.
% 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.
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.
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).
Работа със списъци част 5
Списъци • [] – празен списък • [X|L] – списък • [ 1, 2, 3, 4, 5] опашка глава
Примери • [1, 2 ,3 ] = [1|[2,3]] =[1|[2|[3]]] • [1]=[1|[ ]] • [1,2]= [1|[2]]
Проверка за приндалежност на даден елемент на списък % вграден member(X,[X|_]). member(X,[_|L]):- member(X,L).
| ?- member(1,[1,2,3]). yes | ?- member(1,[4,1,2]). yes | ?- member(X,[1,2,3]). X = 1 ? ; X = 2 ? ; X = 3 ? ; no
[a1, a2, a3, …, an] [b1, b2, b3, …, bm] [X | L1 ] L2 [a1, a2, a3, …, an, b1, b2, b3, …, bm] [X | [ a2, a3, …, an, b1, b2, b3, …, bm] ] L1 L2
Слепване на списъци % вграден append([],L2,L2). append([X|L1],L2,[X|L3]):-append(L1,L2,L3).
| ?- 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
| ?- 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 member(X,L):- append(_,[X|_],L). L1 [X | L2 ] L
Дефиниции чрез append del(X,L,Res):- append(L1,[X|L2],L), append(L1,L2,Res). L1 [X | L2 ] L L1 L2 Res
Изтриване на първото срещане на елемент в списък del(X,[X|L],L). del(X,[Y|L],[Y|Res]):- del(X,L,Res).
Изтриване на всички срещания на елемент в списък 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).
| ?- 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
Изтриване на всички срещания на елемент в списък 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).
| ?- del_all(1,[1,2,1,3],L). L = [2,3] ? ; no
Дължина на списък % вграден length([ ], 0). length([X|L],N):- length(L,M), N is M+1.
Отсичане 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)