Лабораторная работа №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