Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторный практикум.doc
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
3 Мб
Скачать
☆

[Член_семьи(“Инна”,”Иванова”,дата(20,март,1971), работа(студент,45)),

член_семьи(“Олег”,”Иванов”,дата(25,июнь,1978),работа(ученик,0))]).

Для упрощения запросов можно сформировать правила для следующих предикатов: муж, жена, дети, член_семьи, ребенок, дата_рождения, работа (примеры некоторых правил есть в файле semja.pro).

Из базы данных (файл семья.pro) получить следующую информацию:

1. Определить имена всех членов семьи Ивановых.

2. Найти всех жен, родившихся в январе.

3. Найти всех детей моложе 15 лет.

4. Найти фамилии семей, имеющих не менее двух детей.

5. Найти семьи, в которых жена не носит фамилию мужа.

6. Найти семьи, в которых жена не работает.

7. Найти семьи без отца.

8. В какой семье есть дети-близнецы?

9. Найти людей, родившихся до 1950 г. и имеющих оклад менее 150.

10. Найти семьи без детей.

11. Найти семьи, где жена работает, а муж не работает.

12. Найти детей, разница в возрасте родителей которых составляет не менее 15 лет.

13. Найти общий доход семьи Ивановых.

4. Содержание отчета: цель работы, постановка задачи, текст программы, результаты работы программы, выводы.

Контрольные вопросы:

1. Что относится к простым данным ?

2. Что называется простым объектом, простой структурой ?

3. Что такое составной объект и составная структура ?

4. Функтор составного объекта.

5. Могут ли аргументы составного объекта быть также составными объектами ?

6. Объявление составных доменов в разделе программы domains.

7. Сопоставление составных объектов.

8. Могут ли быть элементы списка составными объектами, как такой список объявляется в разделе domains ?

9. Могут ли аргументами составного объекта быть списки ?

10. Как задать цель в разделе goal, чтобы просматривалась вся база данных, состоящая из составных объектов, и в конце просмотра выводилось сообщение Yes ?

11. Объявление альтернативных доменов.

Лабораторная работа 9. Работа с файлами.

1. Цель работы: приобретение практических навыков в составлении и отладке Пролог-программ, использующих файлы.

2. Краткие справочные данные.

При использовании в программе файлов ее необходимо снабдить описанием файлового домена, которое выглядит так:

file=datafile,

где file - стандартный тип домена (файловый), datafile - логическое имя файла.

В файловом описании можно указывать несколько логических имен, но само описание должно быть единственным, например,

file=datafile1;datafile2;datafile3

При работе с файлами могут использоваться следующие встроенные предикаты Турбо-Пролога:

openread(СимволичИмяФайла,ИмяФайлаОС) (file,string) - (i,i) – открытие файла для чтения;

openwrite(СимволичИмяФайла, ИмяФайлаОС) (file,string) - (i,i) – открытие файла для записи;

openappend(СимволичИмяФайла, ИмяФайлаОС) (file,string) - (i,i) – открытие файла для дозаписи в конец существующего файла;

openmodify(СимволичИмяФайла, ИмяФайлаОС) (file,string) - (i,i) – открытие файла для модификации (чтения/записи);

readdevice(СимволичИмяФайла) (file) - (i) (o) – переадресация устройства чтения;

writedevice(СимволичИмяФайла) (file) - (i) (o) – переадресация устройства записи;

closefile(СимволичИмяФайла) (file) - (i) – закрытие файла;

filepos(СимволичИмяФайла,Позиция,Режим) (file,real,integer) - (i,i,i) (i,o,i) – установка или определение позиции указателя файла; Режим: 0 – относительно начала файла, 1– относительно текущей позиции файла, 2 – относительно конца файла; для шаблона (i,o,i) Режим=0;

eof(СимволичИмяФайла) (file) - (i) – проверка на конец файла;

flush(СимволичИмяФайла) (file) - (i) – сброс данных из внутреннего файлового буфера в заданный файл;

existfile(ИмяФайлаОС) (string) - (i) – проверка наличия файла;

filemode(СимволичИмяФайла,Режим)(file,integer) - (i,i) – установка указанного файла в текстовый или двоичный режим: Режим=0 – двоичный, Режим=1 –текстовй;

deletefile(ИмяФайлаОС) (string) - (i) – удаление файла ;

renamefile(СтароеИмяФайлаОС, НовоеИмяФайлаДОС) (string,string) - (i,i) – переименование файла;

disk(ПутьОС) (string) - (i) (o) – установление пути к файлу;

dir(ПутьОС,ШаблонФайла,ИмяФайлаОС) (string,string,string) - (i,i,o) – выбор файла из указанного директория;

file_str(ИмяФайлаОС,Строка) (string,string) – (i,o) (i,i) – запись содержимого текстового файла в строку или наоборот.

Например, при записи данных в файл последовательность действий следующая:

- открытие файла с помощью предиката openwrite;

- назначение файла в качестве устройства записи предикатом writedevice;

- сама запись в файл, например, с помощью предикатов write или writef;

- использование любых других предикатов и правил, отвечающих назначению программы;

- закрытие файла предикатом closefile.

Все эти действия в программе могут быть описаны следующим образом:

openwrite(datafile1,”File1.dat”),

writedevice(datafile1),

< запись в файл >

< любые другие правила или предикаты >

closefile(datafile1).

По такой же схеме могут быть описаны действия чтения данных из файла и дозаписи данных в файл.

Во встроенных предикатах для работы с файлами могут использоваться логические имена стандартных устройств компьютера: keyboard (клавиатура), screen (экран дисплея).

Программа, осуществляющая считывание данных с клавиатуры и запись их в файл, может выглядеть так:

domains

file=datafile

kstr,fstr=string

predicates

readin(kstr,fstr) /* чтение-запись */

create_a_file /* создание файла */

goal

create_a_file.

clauses

create_a_file:-

nl,nl,write(“Введите имя файла”),nl,nl,

readln(Filename),

openwrite(datafile,Filename),

writedevice(datafile),

readln(Kstr),/* ввод первой строки с клавиатуры */

concat(Kstr,”\13\10”,Fstr),

readin(Kstr,Fstr),

closefile(datafile).

/* Ввод последующих строк и запись их в файл */

readin(“stop”,_):-!.

readin(_,Fstr):- write(Fstr),readln(Kstr1),

concat(Kstr1,”\13\10”,Fstr1),

readin(Kstr1,Fstr1).

В приведенной программе

Kstr - строка, вводимая с клавиатуры,

Fstr - строка, выводимая в файл.

Содержимым файла Filename будут дополненные символами “\13\10” вводимые пользователем строки. Дополнение строки символами “\13\10” необходимо для того, чтобы предикат readln мог различать строки при считывании их из файла в дальнейшем. Работа программы заканчивается, если введена строка “stop”. Вместо символов “\13\10” можно использовать символ “\n”.

3. Содержание задания по лабораторной работе.

Из входной строки, содержащей последовательность слов (например, женские имена), разделенных пробелами, получить предложения с заданным именем функтора (например, женщина), аргументами которого являются слова входной строки. Каждое предложение должно располагаться в отдельной строке и заканчиваться точкой. Предложения записать в файл, а затем из файла вывести на экран дисплея.

  1. Задачи по работе с файлами.

4.1. Разделение текстового файла на два примерно одинаковой длины по границе строки.

4.2. Объединение трех текстовых файлов в один.

4.3. Нахождение в текстовом файле двух самых коротких строк.

4.4. Нахождение в текстовом файле трех самых длинных строк.

4.5. Определение средней длины строк текстового файла.

4.6. Извлечение из текстового файла строк, длина которых меньше заданной.

4.7. Извлечение из текстового файла строк, длина которых больше заданной.

4.8. Сортировка строк текстового файла в порядке уменьшения их длины.

4.9. Сортировка строк текстового файла в порядке увеличения их длины.

4.10. Извлечение из текстового файла строк, в которых есть числовые данные.

4.11. Подсчет в текстовом файле количества строк, длина которых меньше заданной.

4.12. Подсчет в текстовом файле количества строк, длина которых больше заданной.

4.13. Подсчет количества цифровых символов в текстовом файле.

4.14. Удаление из файла, содержащего текст Пролог-программы, комментариев.

4.15. Удаление из текстового файла строк, в которых нет заглавных букв.

4.16. Дублирование каждой второй строки текстового файла.

4.17. Усечение всех строк текстового файла до указанной длины.

4.18. Извлечение из текстового файла строк, закачивающихся точкой.

  1. Содержание отчета: цель работы, постановка задачи, текст программы, результаты работы программы, выводы.

Контрольные вопросы:

    1. Объявление файловых доменов.

    2. Какие из устройств являются стандартными устройствами ввода и вывода по умолчанию.

    3. Встроенные логические имена стандартных устройств ввода-вывода.

    4. Что такое логическое (символическое) имя файла и где оно объявляется ?

    5. Может ли быть записано логическое имя файла в программе с прописной буквы ?

    6. Сохраняется ли содержимое файла, открытого для записи предикатом openwrite ?

    7. Как можно дополнить содержимое файла новыми данными ?

    8. Какой предикат открывает файл одновременно на чтение и запись ?

    9. Что произойдет, если файл, открытый для записи, не закрыть предикатом closefile ?

    10. Какие предикаты служат для переадресации устройств чтения-записи ?

    11. Как можно записать содержимое всего текстового файла в строку ?

    12. Нужно ли открывать и закрывать файл при использовании предиката file_str?

    13. Как наиболее просто вывести содержимое всего текстового файла на экран ?

    14. Что используется в качестве аргументов в предикатах eof и existfile ?

    15. Какой предикат служит для чтения строки из файла ?

    16. Можно ли использовать предикат filemode для установления режима работы с файлом (бинарный или текстовый) ?

    17. Назначение третьего аргумента предиката filepos.