prolog_1_2007_final_version

Download Report

Transcript prolog_1_2007_final_version

Програмиране на Пролог
доц. Светла Бойчева
Факултет по математика и информатика
СУ “Св. Климент Охридски”
Съдържание на курса








Теоретични основи на езика Пролог. Основни понятия от
предикатното смятане от първи ред. Клаузна форма.
Метод на резолюцията. Пример. Унифициращ алгоритъм. Пример.
Преход към езика Пролог синтактични и семантични ограничения
Въведение в програмирането на езика Пролог. Факти. Въпроси.
Променливи. Конюнкции. Правила. Механизъм за възврат.
Рекурсия. Синтаксис и семантика на програмите
Синтаксис на езика Пролог. Информационни обекти. Символи.
Термове (константи, променливи, структури). Съпоставяне на
термове. Синтаксис на програма на Пролог
Запознаване със средата за програмиране SWI-Prolog
Семантика. Декларативна семантика. Процедурна семантика.
Списъци. Синтаксис. Семантика. Вътрешно представяне.
Унификация
Основни операции над списъци: Проверка, дали елементът
принадлежи на списък. Конкатенация на списъци предикат append
и прилагането му за разбиване на списък на части; за търсене на
шаблон в списък. Включване на елемент в списък. Изключване на
елемент от списък. Проверка, дали списък е подсписък на даден
списък
Съдържание на курса








Оператори. Дефиниране на оператори. Отношения между
аритметични изрази. Събиране на полиноми
Вградени предикати без странични ефекти. Определяне на типа на
терм. Управляващи предикати fail и !. Използване на !. Примери.
Проблеми с !. Управляващи предикати true и repeat
Предикати за работа с БД (assert, retract, asserta, assertz).
Примери
Вход и Изход. Работа с файлове
Вградени предикати за работа с термове. Създаване и
декомпозиция на атоми. Вграден предикат name. Създаване и
декомпозиране на термове (=.., functor, arg).
Стил на програмиране
Практика на програмирането на Пролог. Операции над структури от
данни. Двоично дърво. Представяне. Основни операции:
принадлежност на елемент в двоично дърво. Двоично наредено
дърво. Принадлежност на елемент в двоично наредено дърво.
Включване и изключване на елемент от двоично дърво
Графи. Логическо описание. Представяне. Търсене на ацикличен
път в граф. Търсене на Хамилтонови цикли в граф. Търсене на
пътища с определена стойност. Минимални и максимални пътища
в граф
Пролог
Основни стилове за програмиране
Императивен (процедурен)
програма = алгоритъм +
структури от данни
Дескриптивни (декларативен)
програма = факти + правила
изпълнение = доказателство (извод)
Езици за логическо програмиране
Литература






М. Тодорова, Езици за функционално и
логическо програмиране, Втора част, Логическо
програмиране, Ciela, 2003
Ivan Bratko, Prolog Programming for Artificial
Intelligence, third edition, Addison-Wesley,2001
Дочев Д., Х. Дичев, З. Марков, Г. Агре,
Програмиране на Пролог. Основи и приложения,
С., Наука и изкуство, 1989.
Richard A. O’Keefe, The Craft of Prolog, The MIT
Press, 1990
Leon Sterling, The Practice of Prolog, The MIT
Press, 1990
Leon Sterling and Ehud Shapiro, The Art of Prolog,
The MIT Press, 1986
Теоретични основи на
езика Пролог
част 1
Теоретични основи на
езика Пролог
Основни понятия от предикатното
смятане от първи ред.
Клаузна форма.
Метод на резолюцията. Пример.
Основни понятия
Основни понятия
Основни понятия
Задача 1
Задача 2
Преход към езика Пролог
част 2
Преход към езика Пролог
 Унифициращ алгоритъм. Пример.
 Преход към езика Пролог синтактични и
семантични ограничения
Терм
Унификация на терми
Унификация на терми
Примери
Z=s(b,a)
Въведение в
програмирането на езика
Пролог
част 3
Въведение в програмирането
на Пролог
Факти
Въпроси
Променливи
Конюнкции
Правила
Механизъм за възврат
Рекурсия
Синтаксис и семантика на програмите
Клаузи
Факти
Правила
Цели
Символни константи
 последователност от символи, която
започва с малка буква “a..z” и може да
съдържа малки букви “a..z”, главни букви
“A..Z”, цифри “0..9” и символа долна черта
“_”
 Примери:
 my_function, a12, b, x_y, f_15, delete
Променливи
 Последователност от символи, която
започва с главна буква “A..Z” и може да
съдържа малки букви “a..z”, главни букви
“A..Z”, цифри “0..9” и символа долна черта
“_” - наричат се именувани променливи
 Символът долна черта “_” – нарича се още
анонимна променлива
 Примери:
 X, Y, A12, My_variable, XY_8
_
Tom
Pam
Bob
Ann
Liz
Pat
Jim
Дефиниране на релации чрез
Факти
parent(tom,bob).
parent(tom,liz).
parent(pam,bob).
parent(bob,ann).
parent(bob,pat).
parent(pat,jim).
Задаване на въпроси
Цели
| ?- parent(tom,bob).
yes
| ?- parent(bob,tom).
no
| ?- parent(tom,sam).
no
Задаване на въпроси
Цели
| ?- parent(tom,X).
X = bob ?
yes
| ?- parent(tom,X).
X = bob ? ;
X = liz ? ;
no
| ?- parent(X,bob).
X = tom ? ;
X = pam ? ;
no
преудовлетворяване
на целта
Задаване на въпроси
Цели
| ?- parent(X,Y).
X =
Y =
X =
Y =
X =
Y =
X =
Y =
X =
Y =
X =
Y =
no
tom,
bob ?
tom,
liz ?
pam,
bob ?
bob,
ann ?
bob,
pat ?
pat,
jim ?
;
;
;
;
;
;
Задаване на въпроси
Цели
| ?- parent(X,Y), parent(Z,Y).
X = tom,
Y = bob,
Z = tom?
yes
| ?- parent(X,Y), parent(Z,Y), X \= Z.
X =
Y =
Z =
X =
Y =
Z =
no
tom,
bob,
pam ? ;
pam,
bob,
tom ? ;
Дефиниране на релации чрез
Правила
male(tom).
male(bob).
male(jim).
female(pam).
female(liz).
female(ann).
female(pat).
father(X,Y):- male(X)
глава
то / then
mother(X,Y):female(X),
parent(X,Y).
,
parent(X,Y).
тяло
ако / if
и / and /
конюнкция
| ?- father(tom,X).
X = bob ? ;
X = liz ? ;
no
| ?- father(pam,X).
no
Правила
brother(X,Y):male(X),
parent(Z,X), parent(Z,Y),
X \= Y.
sister(X,Y):female(X),
parent(Z,X), parent(Z,Y),
X \= Y.
Правила
uncle(X,Y):male(X),
parent(Z,Y),
brother(X,Z).
aunt(X,Y):female(X),
parent(Z,Y),
sister(X,Z).
grandparent(X,Y):parent(X,Z),
parent(Z,Y).
Рекурсия
Гранично условие (stop)
Рекурсивно правило
Рекурсия
offspring(X,Y):parent(X,Y).
offspring(X,Y):parent(X,Z), offspring(Z,Y).
offspring(X,Y):parent(X,Z), offspring(Z,Y).
offspring(X,Y):parent(X,Y).
offspring(X,Y):parent(X,Y).
offspring(X,Y):offspring(X,Z),parent(Z,Y).
offspring(X,Y):offspring(X,Z),parent(Z,Y).
offspring(X,Y):parent(X,Y).
SWI-Prolog
Prolog
SWI-Prolog
www.swi-prolog.org
Arity Prolog
http://www.arity.com/Prolog/
SICSTUS Prolog
 http://www.sics.se/isl/sicstuswww/site/index.html
LPA Prolog
http://www.lpa.co.uk/win.htm
SWI Prolog
SWI Prolog
?-consult(‘/home/defaultobs/test.pl’).
?-consult(‘c:/temp/test.pl’).
Някои вградени предикати
Задача
Факти
str_kont('Egypt' 'Africa').
str_kont('Russia','Europe').
str_kont('Russia','Asia').
str_kont('France','Europe').
str_kont('Japan','Asia').
str_kont('MagicLand','Europe').
stolica_str('Talin', 'Estonia').
stolica_str('Moscow', 'Russia').
stolica_str('Paris','France').
stolica_str('Tokyo', 'Japan').
stolica_str('Abra Kadabra', 'MagicLand').
Факти
% gr_nasel(G,N)
gr_nasel('Sofia',1850000).
gr_nasel('Tokyo',7500500).
gr_nasel('Moscow',21000300).
gr_nasel('Paris',6600500).
gr_nasel('Berlin',9000888).
gr_nasel('Plovdiv',550000).
gr_nasel('Silistra',95000).
gr_nasel('Karnobat',95000).
gr_nasel('Abra Kadabra',33333333).
1
?- str_kont('Bulgaria','Europe').
Yes
2
?- str_kont('Bulgaria',X).
X = 'Europe' ;
No
?- str_kont('Russia',X).
X = 'Europe' ;
X = 'Asia' ;
No
?-
3 – Вариант 1
?- str_kont(X,'Europe'),write(X),nl,fail.
Russia
France
MagicLand
Bulgaria
No
3 – Вариант 2
?- str_kont(X,'Europe').
X = 'Russia' ;
X = 'France' ;
X = 'MagicLand' ;
X = 'Bulgaria' ;
No
4
european_capital_city(City):stolica_str(City,Country),
str_kont(Country,'Europe').
?- european_capital_city(X).
X = 'Moscow' ;
X = 'Paris' ;
X = 'Abra Kadabra' ;
No
5
task_5(City):gr_nasel(City,K),
K > 3000000.
?- task_5(X).
X = 'Tokyo' ;
X = 'Moscow' ;
X = 'Paris' ;
X = 'Berlin' ;
X = 'Abra Kadabra' ;
No
?-
6
task_6(City):- gr_nasel(City,K), K > 7000000,
stolica_str(City,_).
?- task_6(X).
X = 'Tokyo' ;
X = 'Moscow' ;
X = 'Abra Kadabra' ;
No
7
task_7(City):- gr_nasel(City,K),
K > 7000000,
stolica_str(City,Z),
str_kont(Z,'Europe').
?- task_7(X).
X = 'Moscow' ;
X = 'Abra Kadabra' ;
No
8
task_8:gr_nasel(X,K),
gr_nasel(Y,K),
X \= Y.
?- task_8.
Yes
setof
setof( Template, Goal, Set)
like(john,beer).
like(peter,water).
like(peter,beer).
like(ann,water).
like(george,coke).
?-setof(X,like(X,water),S)
S=[ann,peter]
?-setof(X,like(X,Y),S).
Y=beer
S=[john,peter]
?-setof(X, Y^like(X,Y), S).
S=[ann,george,john,peter].
findall
findall( Template, Goal, List)
like(peter,water).
like(peter,beer).
like(john,beer).
like(ann,water).
like(george,coke).
?-findall(X,like(X,water),L).
L=[peter,ann]
?-findall(X,like(X,Y),L).
L=[peter, peter, john,ann,george].
9
task_9(C):str_kont(X,C),
stolica_str(Y,X),
gr_nasel(Y,K),
K>4000000.
?- task_9(S).
S = 'Europe' ;
S = 'Asia' ;
S = 'Europe' ;
S = 'Asia' ;
S = 'Europe' ;
No
9
task_9_help(S):setof(C,task_9(C),S).
?- task_9_help(S).
S = ['Asia', 'Europe']
Yes
10
task_10(X):gr_nasel(X,_),
\+ stolica_str(X,_).
?- task_10(X).
X = 'Sofia' ;
X = 'Berlin' ;
X = 'Plovdiv' ;
X = 'Silistra' ;
X = 'Karnobat' ;
No
11,12
task_11(X):gr_nasel(X,K),
once( (gr_nasel(_,M),K < M )) .
task_11a(X):gr_nasel(X,K),
gr_nasel(_,M),K < M .
task_11_help(X):setof(C,task_11a(C),X).
11,12
?- task_11_help(X).
X = ['Berlin', 'Karnobat', 'Moscow', 'Paris', 'Plovdiv', 'Silistra', 'Sofia', 'Tokyo']
?- task_11(X).
X = 'Sofia' ;
X = 'Tokyo' ;
X = 'Moscow' ;
X = 'Paris' ;
X = 'Berlin' ;
X = 'Plovdiv' ;
X = 'Silistra' ;
X = 'Karnobat' ;
No
13
task_13(X):gr_nasel(X,K),
\+ (gr_nasel(_,M), M < K).
?- task_13(X).
X = 'Silistra' ;
X = 'Karnobat' ;
No
14
task_14(X):-str_kont(X,'Asia').
task_14(X):-str_kont(X,'Europe').
14a
task_14(X):str_kont(X,'Asia');
str_kont(X,'Europe').
14
?- task_14(X).
X = 'Russia' ;
X = 'Japan' ;
X = 'Russia' ;
X = 'France' ;
X = 'MagicLand' ;
X = 'Bulgaria' ;
No
Факти
str_kont('Egypt' 'Africa').
str_kont('Russia','Europe').
str_kont('Russia','Asia').
str_kont('France','Europe').
str_kont('Japan','Asia').
str_kont('MagicLand','Europe').
stolica_str('Talin', 'Estonia').
stolica_str('Moscow', 'Russia').
stolica_str('Paris','France').
stolica_str('Tokyo', 'Japan').
stolica_str('Abra Kadabra', 'MagicLand').
Факти
% gr_nasel(G,N)
gr_nasel('Sofia',1850000).
gr_nasel('Tokyo',7500500).
gr_nasel('Moscow',21000300).
gr_nasel('Paris',6600500).
gr_nasel('Berlin',9000888).
gr_nasel('Plovdiv',550000).
gr_nasel('Silistra',95000).
gr_nasel('Karnobat',95000).
gr_nasel('Abra Kadabra',33333333).
Правила
europe_stolica(Y):- str_kont(X, 'Europe'),stolica_str(Y,X).
city(X,N):-gr_nasel(X,K), K > N.
find_4(X):- str_kont(Z,X), stolica_str(Y,Z), city(Y,4000000).
once(X):-call(X),!.
task12(X):- gr_nasel(X,K),once( (gr_nasel(_,T), K<T)) .
task13(X):-gr_nasel(X,K), \+ (gr_nasel(Y,T), T< K).
Задача
person(ivan).
person(petar).
person(maria).
person(anna).
person(elena).
person(dimitar).
person(tanya).
person(veselin).
Факти
% male(X)
male(ivan).
male(petar).
male(dimitar).
% female(X)
female(X):-person(X), \+ male(X).
Факти
% likes(X,Y) likes(ivan,football).
likes(ivan,computer_games).
likes(ivan,books).
likes(maria,tennis).
likes(maria,flowers).
likes(anna,football).
likes(anna,books).
likes(anna,computer_games).
likes(petar,tennis).
likes(tanya,tennis).
likes(maria,football).
likes(maria,books).
likes(dimitar,X):-likes(petar,X).
% loves(X,Y) loves(ivan,maria).
loves(ivan,anna).
loves(ivan,elena).
loves(petar,maria).
loves(elena,ivan).
loves(maria,petar).
Факти
loves(tanya,X):-male(X).
loves(dimitar,tanya).
loves(maria,ivan).
has(ivan,computer).
has(petar,car).
has(petar,computer).
Задача
Задачи за упражнение
Задачи за упражнение
Задачи за упражнение