+ работа с файлами. Файлы. Динамическая бд чтение и запись информации с файлов
Скачать 67.5 Kb.
|
Файлы. Динамическая БДЧтение и запись информации с файловПри вводе и выводе информации в Прологе используется понятие потоков. Файлы для чтения - это входные потоки. Файлы для записи - это выходные потоки. Для пользователя определены два потока: информация вводимая с клавиатуры - входной поток. информация выводимая на монитор - выходной поток. Эти потоки являются псевдофайлами с именем user. В каждый момент времени для Пролога активны два файла: для ввода - текущий входной поток для вывода - текущий выходной поток. Пример 3. Запись символов в файл myfile.f, который создается на текущем диске. domains file=myfile /* объявляется логическое имя файла myfile */ predicates read_in_loop goal openwrite(myfile,"myfile.f"), writedevice(myfile), not(read_in_loop), closefile(myfile), writedevice(screen), write("\n запись в файл myfile.f произведена \n "). clauses read_in_loop:- readchar(X), X<>'#',!, write(X), read_in_loop. Пример 4. Чтение символа из файла и вывод его на экран дисплея. domains file=infile predicates position goal write(" С каким файлом Вы хотите работать ? \n "), readln(Fname), openread(infile,Fname), position. clauses position:- readdevice(keyboard), nl,write("Введите номер позиции: "), readreal(X), readdevice(infile), filepos(infile,X,0), readchar(Y), write(" Здесь записан символ:",Y), position. Форматный вывод writef writef(Format,Arg1,...,Argn) - подобен write, но осуществляет форматированный вывод в соответствии с параметром Format, который представляется в виде %p Возможные значения p : d - нормальное десятичное число ( символы и целые числа); u - беззнаковое целое; s - строка (атомы или строки); c - символ (символы и целые); g - вещественное в самом коротком формате; e - вещественное в экспоненциальном представлении; f - вещественное в десятичном представлении ( задается по умолчанию); x - шестнадцатиричное число (символы и целые числа). Ввод и вывод чисел и символов Пример 5. Вычисление куба числа, вводимого с терминала. domains i=integer predicates process(i) cube clauses cube:- write("Next number,please:"), readint(X), process(X). process(N):- C=N*N*N, write("Cube",N,"is equal",C,"\n"), cube. goal cube. Пример 6. Считывание целых чисел с терминала и занесение их в список domains list=integer* predicates readlist(list) goal readlist(TheList),write("\n The list is: ", TheList). clauses readlist([H|T]):-readint(H),!,readlist(T). readlist([]). После набора каждого целого числа нужно нажать ENTER. Завершение программы происходит по любому символу, который не является целым числом, плюс ENTER. Пример 7. Вывод списков domains i_list=integer* n_list=symbol* predicates writelist(i_list) writelist(n_list) clauses writelist([]). writelist([H|T]):- write(H," "),writelist(T). 1. Создать символьные файлы f и g. Записать в файл h сначала компоненты файла f, затем компоненты файла g с сохранением порядка. 2. Создать файл f, содержащий целые числа. Переписать в файл g отрицательные числа и определить их количество. 3. Создать символьный файл t. Удалить из текста файла t предпоследний элемент. 4. Создать файл f из натуральных чисел. Найти количество нечетных чисел. 5. Создать файл f, содержащий целые числа. Записать в файл g максимальное и минимальное числа из файла f. 6. Создать файл, состоящий из действительных чисел. Найти их сумму и произведение. 7. Ввести символьную строку с терминала. Определить в ней количество слов. 8. Написать простую программу-калькулятор, которая выполняет четыре арифметических действия над целыми числами, вводимыми с терминала. 9. Написать программу, считывающую с терминала произвольные предложения и выводящую их на терминал в форматированном виде, в котором все группы идущих подряд пробелов заменены на одиночные пробелы. 10. Ввести строку с терминала. Преобразовать введенную строку в список слов, упорядоченных лексикографически. 11. Ввести строку с терминала. Вычислить минимальную и максимальную длины слов строки. 12. Создать текстовый файл f. Преобразовать этот файл в список слов, упорядоченных по длине, и вывести этот список на терминал. Динамическая база данных – это база данных, в которую время от времени требуется вносить изменения, отражающие изменения структуры описываемой системы Встроенные предикаты дают возможность корректировать базу данных (БД) в процессе выполнения программы путем: 1) добавления к программе (в процессе вычислений) новых фактов; 2) вычеркиванием из нее уже существующих фактов. Предикаты выполняющие операции над БД: 1. assert(d) всегда успешен и добавляет факт d к базе данных; 2. retract(d) удаляет факт, сопоставимый с d; 3. asserta(d) - обеспечивает запись в базу данных нового факта перед имеющимися фактами для заданного отношения; 4. assertz(d) - обеспечивает запись в базу данных нового факта после всех имеющихся фактов для заданного отношения. Объявление динамической базы данных, в которую факты могут добавляться во время выполнения программы или выбираться из файла посредством предиката consult, осуществляется посредством ключевого слова database. Ввод строки assertz(ms(k155ir1,rg,4,4)) приводит к добавлению факта s(k155ir1,rg,4,4) в базу данных. Ввод строки retract(ms(Q,i_ne,W,E)) приведет к удалению из БД всех объектов для элементов типа i_ne. Для сохранения БД на диске в заданном файле (например, mybase.dba) необходимо ввести строку save("mybase.dba"). Затем в этой же или в другой программе на основе полученного файла можно создать новую БД. Для этого необходимо ввести строку consult("mybase.dba"). В результате существующая БД дополняется объектами из файла mybase.dba. Для сохранения поименованной БД используется предикат save(DosFileName,DataBaseName). Для создания поименованной БД из фактов, расположенных в файле, используем предикат consult(DosFileName,DataBaseName). Пример 1. domains tip,fun=symbol x,kol=integer database ms(tip,fun,x,kol) /* tip - тип микросхемы; fun - реализуемая функция; x - число входов; kol - число элементов */ clauses ms(k155la3,i_ne,2,4). ms(k155la4,i_ne,3,3). ms(k155la1,i_ne,4,2). ms(k155ln1,ne,1,6). ms(k155le1,ili,2,4). ms(k155li3,i,3,3). Накопление в базе данных ответов на вопросы Пусть, например, в программе определен предикат solve(Problem,Solution). Мы можем теперь задать вопрос и потребовать, чтобы ответ на него был запомнен для того, чтобы облегчить получение ответов на будущие вопросы: solve(Problem,Solution), asserta(solve(Problem,Solution)). Пример 3. Формирование таблицы умножения В базе данных формируется таблица умножения в виде совокупности термов вида prod(X,Y,Z), где X и Y - сомножители, а Z - произведение. Эта таблица сохраняется в файле tabl.dba при помощи цели save("tabl.dba"). domains i=integer list=i* predicates repeat member(i,list) tabl run database prod(i,i,i) counter(i) clauses repeat. repeat :- repeat. member(X,[X|_]). member(X,[_|L]) :- member(X,L). tabl :- repeat, L=[1,2,3,4,5,6,7,8,9], member(X,L), member(Y,L),Z=X*Y, assert(prod(X,Y,Z)), counter(V),W=V+1, retract(counter(V)), asserta(counter(W)),W=81. run :- assert(counter(0)), tabl, retract(counter(_)), save("tabl.dba"). Goal run. Пример 4. Считывание БД из файла. Таблица умножения, сформированная в примере 3, считывается предикатом consult("tabl.dba") из файла tabl.dba и выводится на терминал. domains i=integer database prod(i,i,i) Goal: consult("tabl.dba"),prod(X,Y,Z). /* Цель задается с терминала в окне диалога */ Пример 5. База данных о читателях. Формируется БД о читателях в виде совокупности термов вида reader(Фамилия,Номер_читательского_билета,Дата_посещения_библиотеки). Далее определяется количество читателей, посетивших библиотеку 10- го "числа". domains i=integer database reader(symbol,i,i) counter(i) predicates wr(i,i) repeat inbase count(i,i) clauses repeat. repeat :- repeat. count(X,Y) :- counter(X),Y=X+1, retract(counter(X)), assert(counter(Y)). inbase :- repeat, /* Занесение информации о читателях в БД */ write('&'),readln(Name), /* считывание фамилии читателя */ readint(Ticket), /* считывание номера чит. билета */ readint(Date), /* считывание даты посещения */ assert(reader(Name,Ticket,Date)), count(_,Y),Y=5. /* количество читателей = 5 */ wr(D,Y) :- /* подсчет числа читателей*/ retract(reader(_,_,D)), /* с датой посещения D */ count(Y,Y1), wr(D,Y1). wr(_,Y) :- counter(Y), /* Выдача числа читателей*/ write("Count=",Y),!. /* на терминал */ goal assert(counter(0)), inbase, save("reader.dba"), /* БД сохраняется в файле reader.dba */ asserta(counter(0)), wr(10,Y). Варианты заданий по теме «Динамические БД» 1.Создать БД, содержащую сведения о пассажирах: Ф.И.О., количество мест, вес багажа. Определить, есть ли пассажиры, багаж которых занимает 1 место и вес багажа больше 30 кг. 2.Создать БД о студентах вашей группы: Фамилия, Имя, Год рождения. Получить список студентов старше 20 лет. 3.Соэдать БД, содержащую сведения: Ф.И.О., профессия, оклад. Найти среднемесячную заработную плату для инженеров. 4.Создать БД о группе студентов: Фамилия, Имя. Выяснить, имеются ли в группе однофамильцы. 5.Создать БД со сведениями о файлах: спецификация файла, дата создания, размер файла. Получить сведения о файлах, имеющих размер более 5 блоков. 6.Создать БД о металлах: Наименование, Удельная проводимость, Удельная стоимость. Найти металлы с максимальной проводимостью и минимальной стоимостью. 7.Создать БД с расписанием движения поездов: Номер поезда, Пункт назначения, Время отправления, Время в пути, Стоимость билета. Найти номер и время отправления самого скорого поезда до Москвы. 8.Создать БД с расписанием движения самолетов: Номер рейса, Пункт отправления, Пункт прибытия, Время отправления, Время в пути, Стоимость билета. Определить маршрут движения из Новосибирска в Нью-Йорк, время в пути и стоимость проезда. 9. Создать БД с таблицей игр чемпионата по футболу: Первая команда, Вторая команда, Счет игры. Определить чемпиона. 10. Создать БД с книжным каталогом: Ф.И. автора, Название книги, Издательство, Год издания. Найти все книги, изданные в издательстве "Наука" после 1990 года. 11. Создать БД со сведениями о стоимости товаров: Наименование товара, Стоимость товара. Определить суммарную стоимость указанных в БД товаров, найти товары с максимальной и минимальной стоимостями. |