Лабораторная работа №1. Знакомство со средой программирования Prolog. Родственные отношения в логическом понятии.
Задание:
Используя предикаты parent(symbol, symbol), man(symbol), woman(symbol) записать 20 фактов, несущих информацию о членах своей семьи. На их основе сформулировать 6 правил вывода остальных отношений в пределах 3 поколений.
predicates
parent (string, string)
man (string)
woman (string)
mother (string, string)
father (string, string)
daughter (string, string)
son (string, string)
brother(symbol, symbol)
grandmother (string, string)
grandfather (string, string)
clauses
parent ("Hanif","Ildar").
parent ("Galiya","Ildar").
parent ("Hanif","Timur").
parent ("Galiya","Timur").
parent ("Hakim","Hanif").
parent ("Rashida","Hanif").
parent ("Mubin","Galiya").
parent ("Hakima","Galiya").
woman ("Galiya").
woman ("Rashida").
woman ("Hakima").
man ("Ildar").
man ("Timur").
man ("Hanif").
man ("Hakim").
man ("Mubin").
mother(X, Y):-parent(X, Y),woman(X).
father(X, Y):-parent(X, Y),man(X).
daughter(X, Y):-parent(Y, X),woman(X).
son(X, Y):-parent(Y, X),man(X).
brother(X, Y):-parent(Z, X),parent(Z, Y),man(X),X<>Y.
grandmother(X, Y):-woman(X), parent(X, Z), parent(Z, Y).
grandfather(X, Y):-man(X), parent(X, Z), parent(Z, Y).


Лабораторная работа №2. Поиск с возвратом.
Цель: изучить возможности принудительной неудачи при обработке простейшей базы знаний.
Задание:
Написать программу, реализующую определенную структуру данных. Каждый факт должен содержать не менее трех элементов в кортеже, количество записей – фактов не менее 15. Реализовать вывод всей информации из структуры, поиск по одному и по двум атрибутам записи.
вариант | структура данных |
10 | Поваренная книга. |
predicates
salat(string, string, string, string, string)
printall
search1(string)
search2(string, string)
clauses
salat("Oliv'e","kartofel","kolbasa","ogurec","yaico").
salat("Svecha","griby","kurica","ogurec","yaico").
salat("Nadezhda","chernosliv","kurica","ogurec","syr").
salat("Mimoza","kartofel","ryba","syr","yaico").
salat("Grecheskii","ogurec","perec","pomidor","syr").
salat("Diplomat","apelsin","syr","yabloko","yaico").
salat("Cezar","grenki","kurica","salat","syr").
salat("Serdce","avokado","krevetki","ogurec","pomidor").
salat("Ananas","ananas","kartofel","kolbasa","yaico").
salat("Letnii","ogurec","pomidor","perec","tunec").
salat("Shuba","kartofel","morkov","seld'","svekla").
salat("Vinegret","kapusta","kartofel","morkov","svekla").
salat("Garmonia","avokado","ogurec","perec","pomidor").
salat("Raduzhnyi","morkov","olivki","svekla","selderei").
salat("Granatovyi braslet","granat","kartofel","kurica","morkov").
printall:-write("\t \t Povarennaya kniga\nNazvanie \t \t \t Ingridienty \n"),
salat(X, Y,Z, V,W), writef ("%-20s%-15s%-15s%-15s%s \n",X, Y,Z, V,W),fail.
%poisk po nazvaniyu
search1(X):-
salat(X, Y,Z, V,W), writef ("%-15s%-15s%-15s%s",Y, Z, V, W),nl, fail.
%poisk po ingridientu
search1(X):-
salat(W, X,Y, Z,V), writef ("%-20s%-15s%-15s%",W, Y, Z, V),nl, fail;
salat(W, Y,X, Z,V), writef ("%-20s%-15s%-15s%",W, Y, Z, V),nl, fail;
salat(W, Z,Y, X,V), writef ("%-20s%-15s%-15s%",W, Z, Y, V),nl, fail;
salat(W, Z,Y, V,X), writef ("%-20s%-15s%-15s%",W, Z, Y, V),nl, fail.
%poisl po 2 ingridientam
search2(X, Y):-
salat(W, X,Y, Z,V), writef ("%-20s%-15s%",W, Z, V),nl, fail;
salat(W, X,Z, Y,V), writef ("%-20s%-15s%",W, Z, V),nl, fail;
salat(W, X,Z, V,Y), writef ("%-20s%-15s%",W, Z, V),nl, fail;
salat(W, Z,X, Y,V), writef ("%-20s%-15s%",W, Z, V),nl, fail;
salat(W, Z,X, V,Y), writef ("%-20s%-15s%",W, Z, V),nl, fail;
salat(W, Z,V, X,Y), writef ("%-20s%-15s%",W, Z, V),nl, fail.


Лабораторная работа №3. Рекурсия.
Цель: изучить технологию построения рекурсивных логических правил вывода.
Задание: Написать рекурсивную программу вычисления значения выражения. Результат выведите в виде таблицы. Применить нехвостовую и хвостовую рекурсии.
вариант | задание |
10 | Значения степеней 2n/2. |
predicates
h(integer)
h(integer, integer, real)
nh(integer)
nh(integer, real)
clauses
%хвостовая
h(N):-write(0," ",1),nl, R=sqrt(2),h(1,N, R).
h(N, N,X):-!.%write(N," ",X,"end"),nl,!.
h(I, N,X):-write(I," ",X),nl, I2=I+1,
X2=X*sqrt(2),h(I2,N, X2).
%не хвостовая
nh(N):-nh(N, Z).
nh(1,1):-write(0," ",1),nl,!.
nh(N, X):-N2=N-1,nh(N2,X2),
X=sqrt(2)*X2,write(N2," ",X),nl.
goal
write("N="),
readreal(N),
%write("hvostovaya rekursiya"),nl,
%write("N 2^N/2"),nl,
%h(N),nl,
write("ne hvostovaiya rekursiya"),
write("N 2^n/2 "),nl,
nh(N).


Лабораторная работа №4. Обработка списков.
Цель: применить рекурсивные правила для обработки рекурсивного типа данных (список).
вариант | задание |
10 | Удалить из списка все четные по значению элементы. |
DOMAINS
list = integer*
PREDICATES
f(list, list)
CLAUSES
f([], []):-!.
f([H|T],Tail):-H mod 2=0, f(T, Tail),!.
f([H|T],[H|Tail]):-f(T, Tail).

Лабораторная работа №5. Рекурсивные структуры данных (деревья).
Цель: рассмотреть рекурсивную структуру данных на примере обработки бинарного дерева.
вариант | задание |
10 | Написать программу, вычисляющую количество вершин на k-том уровне дерева. |
DOMAINS
tr=tr(integer, tr, tr);empty
PREDICATES
tree(real, tr, integer)
tree0(real, tr)
CLAUSES
tree0(_,empty):-write(0).
tree0(0,_):-write(1).
tree0(Ur, tr(Root, L,R)):-tree(Ur, tr(Root, L,R),Kol),
write(Kol).
tree(_,empty,0):-!.
tree(0,_,1):-!.
tree(Ur, tr(Root, L,R),Kol):-
Nu=Ur-1,
tree(Nu, L,Kol1),
tree(Nu, R,Kol2),
Kol=Kol1+Kol2.
GOAL
write("Ur="),
readint(Ur),
write("Kol="),
tree0(Ur,
tr(2,
tr(3,
tr(1,
tr(5,empty, empty),
tr(9,empty, tr(3,empty, empty))),
tr(4,empty, empty)),
tr(1,
tr(7,
tr(4,empty, empty),
empty),
tr(2,empty, empty)))).
Ur Derevo
0 2
/ \
1 3 1
/ \ / \
/ \ /
\
4 3
Лабораторная работа №6. Базы данных.
Цель: описать логически реляционную базу данных.
Задание: Создать базу данных из начальной базы с учетом приведенных условий. Выполнить реализацию внешней базы данных, при этом результат поместить во внешний файл. При реализации внутренней базы данных результат выводится в окно выполнения Пролога.
Вариант 10
База содержит факты произвольного вида. Написать программу, выводящую все факты, входящие в базу только один раз.
DOMAINS
list=string*.
DATABASE
zoopark(string)
PREDICATES
del(string).
perebor(list).
perebor(list, string, list).
poisk(list, string, integer).
CLAUSES
del(H):- retract(zoopark(H)).
perebor([]).
perebor([H|T]):- poisk(T, H,1),perebor(T, H,D),perebor(D).
perebor([],_,[]).
perebor([H|T],X, D):- H=X, perebor(T, H,D).
perebor([H|T],X,[H|D]):- perebor(T, X,D).
poisk([],X, N):- N=1,write(X),assertz(zoopark(X)),nl;!.
poisk([H|T],X, N):-H=X, M=N+1, poisk(T, X,M);
poisk(T, X,N).
Goal
consult("in. txt"),
findall(H, del(H), R),
perebor(R),
save("out. txt").

in. txt | out. txt | |
zoopark("medved") zoopark("volk") zoopark("gepard") zoopark("pesec") zoopark("slon") zoopark("yaguar") zoopark("zebra") zoopark("opossum") zoopark("panda") zoopark("medved") zoopark("volk") zoopark("gepard") zoopark("enot") zoopark("pesec") | zoopark("slon") zoopark("zhiraf") zoopark("medved") zoopark("opossum") zoopark("volk") zoopark("pesec") zoopark("medved") zoopark("gepard") zoopark("volk") zoopark("slon") zoopark("zebra") zoopark("opossum") zoopark("antilopa") | zoopark("yaguar") zoopark("panda") zoopark("enot") zoopark("zhiraf") zoopark("antilopa") |
Лабораторная работа №7. Строки и файлы.
Цель: изучить работу с файловой системой в среде Пролога.
Задание: преобразовать текст в файле в соответствии с заданием. Результат сохранить в новом файле.
Вариант 10
Найти в тексте слова-перевертыши из трех и более символов.
DOMAINS
file = f1;f2
PREDICATES
read
del(string)
perev(string)
perev(string, string, string)
CLAUSES
read:- not(eof(f1)), readln(Str), del(Str), read;!.
del(X):-fronttoken(X, XL, XR),perev(XL),del(XR);!.
perev(X):-str_len(X, LenX),LenX>2,frontstr(1,X, Y,End),perev(End, Y,X);!.
perev(X, Y,X0):-frontstr(1,X, Start, End),concat(Start, Y,Rez),
perev(End, Rez, X0);X0=Y, write(Y),nl.
GOAL
openread(f1,"in. txt"),readdevice(f1),
openwrite(f2,"out. txt"),writedevice(f2),
read, closefile(f1),closefile(f2).
in. txt
dom rotor dovod kanat topot golod kazak topor
kolos zakaz urok komok derevo dohod
out. txt
rotor
dovod
topot
kazak
zakaz
komok
dohod


