Главная страница
Навигация по странице:

  • Пример 3. Запись символов в файл myfile.f, который создается на текущем диске. domains file=myfile /* объявляется логическое имя файла myfile */ predicates

  • Ввод и вывод чисел и символов Пример 5. Вычисление куба числа, вводимого с терминала. domains i=integer predicates

  • Пример 6. Считывание целых чисел с терминала и занесение их в список domains list=integer* predicates readlist(list) goal

  • Пример 7. Вывод списков domains i_list=integer* n_list=symbol* predicates writelist(i_list) writelist(n_list) clauses

  • Динамическая база данных

  • Пример 1. domains tip,fun=symbol x,kol=integer database

  • Накопление в базе данных ответов на вопросы

  • Пример 3. Формирование таблицы умножения

  • Goal

  • Варианты заданий по теме «Динамические БД»

  • + работа с файлами. Файлы. Динамическая бд чтение и запись информации с файлов


    Скачать 67.5 Kb.
    НазваниеФайлы. Динамическая бд чтение и запись информации с файлов
    Дата05.06.2022
    Размер67.5 Kb.
    Формат файлаppt
    Имя файла+ работа с файлами.ppt
    ТипДокументы
    #570452

    Файлы. Динамическая БД

    Чтение и запись информации с файлов


    При вводе и выводе информации в Прологе используется понятие потоков.
    Файлы для чтения - это входные потоки.
    Файлы для записи - это выходные потоки.
    Для пользователя определены два потока:
    информация вводимая с клавиатуры - входной поток.
    информация выводимая на монитор - выходной поток.
    Эти потоки являются псевдофайлами с именем 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. Создать БД со сведениями о стоимости товаров:
    Наименование товара, Стоимость товара.
    Определить суммарную стоимость указанных в БД товаров, найти товары с максимальной и минимальной стоимостями.



    написать администратору сайта