Програмиране на Пролог
DESCRIPTION
Програмиране на Пролог. доц. Светла Бойчева Факултет по математика и информатика СУ “Св. Климент Охридски”. Съдържание на курса. Теоретични основи на езика Пролог. Основни понятия от предикатното смятане от първи ред. Клаузна форма. - PowerPoint PPT PresentationTRANSCRIPT
Програмиране на ПрологПрограмиране на Пролог
доц. Светла БойчеваФакултет по математика и информатикаСУ “Св. Климент Охридски”
Съдържание на курсаСъдържание на курса Теоретични основи на езика Пролог. Основни понятия от
предикатното смятане от първи ред. Клаузна форма. Метод на резолюцията. Пример. Унифициращ алгоритъм. Пример.
Преход към езика Пролог синтактични и семантични ограничения Въведение в програмирането на езика Пролог. Факти. Въпроси.
Променливи. Конюнкции. Правила. Механизъм за възврат. Рекурсия. Синтаксис и семантика на програмите
Синтаксис на езика Пролог. Информационни обекти. Символи. Термове (константи, променливи, структури). Съпоставяне на термове. Синтаксис на програма на Пролог
Запознаване със средата за програмиране SWI-Prolog Семантика. Декларативна семантика. Процедурна семантика. Списъци. Синтаксис. Семантика. Вътрешно представяне.
Унификация Основни операции над списъци: Проверка, дали елементът
принадлежи на списък. Конкатенация на списъци предикат append и прилагането му за разбиване на списък на части; за търсене на шаблон в списък. Включване на елемент в списък. Изключване на елемент от списък. Проверка, дали списък е подсписък на даден списък
Съдържание на курсаСъдържание на курса Оператори. Дефиниране на оператори. Отношения между
аритметични изрази. Събиране на полиноми Вградени предикати без странични ефекти. Определяне на типа на
терм. Управляващи предикати fail и !. Използване на !. Примери. Проблеми с !. Управляващи предикати true и repeat
Предикати за работа с БД (assert, retract, asserta, assertz). Примери
Вход и Изход. Работа с файлове Вградени предикати за работа с термове. Създаване и
декомпозиция на атоми. Вграден предикат name. Създаване и декомпозиране на термове (=.., functor, arg).
Стил на програмиране Практика на програмирането на Пролог. Операции над структури
от данни. Двоично дърво. Представяне. Основни операции: принадлежност на елемент в двоично дърво. Двоично наредено дърво. Принадлежност на елемент в двоично наредено дърво. Включване и изключване на елемент от двоично дърво
Графи. Логическо описание. Представяне. Търсене на ацикличен път в граф. Търсене на Хамилтонови цикли в граф. Търсене на пътища с определена стойност. Минимални и максимални пътища в граф
Аритметични изрази и Аритметични изрази и операториоператори
част 4
Аритметични изразиАритметични изрази
Аритметични операции+ - събиране- - изваждане* - умножение/ - деление// - целочислено деление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]
[a1, a2, a3, …, an, b1, b2, b3, …, bm]
[X | L1 ] L2
[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
Дефиниции чрез Дефиниции чрез appendappend
member(X,L):-
append(_,[X|_],L).
[X | L2 ]L1
L
Дефиниции чрез Дефиниции чрез appendappend
del(X,L,Res):- append(L1,[X|L2],L), append(L1,L2,Res).
[X | L2 ]L1
L
Res
L2L1
Изтриване на първото Изтриване на първото срещане на елемент в срещане на елемент в
списъксписък
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)
ОтсичанеОтсичане
p:- a,b,!,c,d.
p:- e.p
b
a
!
e
d
c
ПримерПример
max(X,Y,X):- X > Y.
max(X,Y,Y):- Y >= X.
max(X,Y,X):- X>Y,!.
max(X,Y,Y).
Пресмятане на сумата от Пресмятане на сумата от елементите на списък от елементите на списък от
числачислаsum([X],X).
sum([X|L],N):-
sum(L,M),
N is M+X.
?- sum([1,2,3],T).
T=6
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).
init(_,[ ]).
init([X|Rest],[X|L]):-
init(Rest,L).
sublist(L,T):-
init(L,T).
sublist([_|Rest],T):-
sublist(Rest,T).
equal([ ],[ ]).
equal([X|Rest1], S2):-
del(X,S2,Rest2), !,
equal(Rest1,Rest2).