- •Белорусский национальный технический университет
- •Функциональное и логическое программирование
- •Лабораторная работа 1. Основы работы с Visual Prolog в режиме Test Goal.
- •Лабораторная работа 2. Составление простейшей пролог-программы.
- •2. Краткие справочные данные.
- •Лабораторная работа 3. Формирование правил.
- •2. Краткие справочные данные.
- •3. Содержание задания по лабораторной работе.
- •4. Содержание отчета.
- •Лабораторная работа 4. Рекурсия.
- •3. Содержание задания по лабораторной работе.
- •4. Задачи на рекурсию.
- •5. Содержание отчета.
- •Лабораторная работа 5. Использование отсечения в пролог-программах.
- •2. Краткие справочные данные.
- •Содержание задания по лабораторной работе.
- •4. Содержание отчета.
- •Лабораторная работа 6. Работа со списками.
- •5. Содержание отчета.
- •Лабораторная работа 7. Работа со строками.
- •Лабораторная работа 8. Использование составных объектов.
- •[Член_семьи(“Инна”,”Иванова”,дата(20,март,1971), работа(студент,45)),
- •Лабораторная работа 9. Работа с файлами.
- •Лабораторная работа 10. Построение меню.
- •Лабораторная работа 11. Динамические базы данных.
- •Лабораторная работа 12. Внешние базы данных.
- •Содержание задания по лабораторной работе.
- •Содержание отчета:
- •Содержание задания по лабораторной работе.
- •Содержание отчета:
- •Лабораторная работа 14. Рекурсивное объявление доменов.
- •Краткие справочные данные.
- •Текст Пролог-программы
- •Содержание задания по лабораторной работе.
- •Содержание отчета:
- •Лабораторная работа 15. Основы работы в среде визуального программирования visual prolog.
- •Содержание задания по лабораторной работе.
- •Лабораторная работа 16. Система программирования mulisp.
- •Содержание задания по лабораторной работе.
- •Лабораторная работа 17. Определение функций в lisp.
- •2. Краткие справочные данные.
- •Представление данных в Лисп.
- •Содержание задания по лабораторной работе.
- •Литература
- •Приложение
- •Содержание
5. Содержание отчета.
В отчете должны быть отражены следующие пункты: цель работы, постановка задачи, текст программы, результаты тестирования, выводы.
Контрольные вопросы:
Что такое список ?
Голова и хвост списка. Изображение списка в виде головы и хвоста.
Как обозначается пустой список ?
Можно ли изобразить пустой список в виде головы и хвоста ?
Что означают следующие виды изображения списка: L, [X], [ _ , A], [ _ |T], [H| _ ], [ _ ], [ _ ,B|C] ?
Может ли быть в голове списка более одного элемента ?
Принадлежит ли элемент 5 списку [[1, 2, 3], [4, 5, 6]] ?
Сопоставимы ли два списка: [5, 6, 7] и [H|T] ?
Можно ли в процедурах ввода списка ввод_списка1 и ввод_списка2 поменять местами первое и второе предложения ?
Как нужно изменить процедуру удал_перв_эл, чтобы можно было удалить из списка: a) два первых элемента; б) второй элемент ?
Как нужно изменить процедуру удал_посл_эл, чтобы из списка были удалены: a) два последние элементы; б) предпоследний элемент ?
Как нужно изменить процедуру выдел_перв_эл, чтобы можно было выделить из списка: a) два первых элемента; б) второй элемент ?
Как нужно изменить процедуру выдел_посл_эл, чтобы из списка можно было выделить: a) два последние элементы; б) предпоследний элемент ?
Как нужно изменить процедуру доб_эл_в_начало, чтобы можно было вставить заданный элемент между первым и вторым элементами списка ?
Как нужно изменить процедуру доб_эл_в_конец, чтобы заданный элемент вставился перед последним элементом списка ?
Можно ли в программе со списками обойтись без раздела domains ?
Лабораторная работа 7. Работа со строками.
1. Цель работы: приобретение практических навыков работы со строками в программах на Visual Prolog.
2. Краткие справочные сведения.
Для работы со строками имеется набор стандартных предикатов:
а) Определение длины строки
str_len(Строка,Длина)(string,integer):(i,o),(i,i).
б) Объединение строк
concat(Стр1,Стр2,Стр3)(string,string,string): (i,i,o)(o,i,i)(i,o,i)(i,i,i).
Строки Стр1 и Стр2 объединяются в строку Стр3.
в) Создание подстрок
frontstr(КолСим,ВхСтр,ВыхСтр,Остаток)(integer,string,string,string): (i,i,o,o).
Выходная строка ВыхСтр получается из входной строки ВхСтр отделением начальных символов, количество которых определяется параметром КолСим, остаток строки связывается с переменной Остаток.
г) Разделение строки на две части - первый символ и оставшаяся часть строки
frontchar(Строка,ПервСимв,Остаток)(string,char,string):(i,o,o)(i,i,o) (i,o,i)(i,i,i)(o,i,i).
Предикат frontchar используется для преобразования строки в список символов. Правило, которое выполняет эту процедуру, следующее:
convert(“”,[]).
convert(Str,[H|T]):-frontchar(Str,H,Ost),convert(Ost,T).
д) Проверка, является ли строка именем Visual Prolog
isname(Строка)(string):(i).
Строка, которая является именем, должна удовлетворять следующим требованиям:
- строка может содержать буквы, цифры и символ подчеркивания;
- строка начинается с буквы;
- между символами не должно быть пробелов.
е) Формирование атомов из строк
fronttoken(Строка,Атом,Остаток)(string,string,string):(i,o,o)(i,i,o)(i,o,i)(i,i,i)
(o,i,i).
Атомом могут быть:
- имя Турбо-Пролога, (напр., summa, a_12);
- строчное представление числа, (напр., "1265", "1.25", "1e-6");
- отдельный символ (кроме пробела), ( напр., 'A', 'x', '%').
Предикат fronttoken может быть использован для преобразования строки в список атомов (по аналогии с предикатом frontchar).
При работе со строками могут использоваться также предикаты преобразования данных из одного типа в другой:
а) Преобразование прописных букв в строчные или наоборот
upper_lower(Стр1,Стр2)(string,string):(i,i)(i,o)(o,i).
б) Преобразование строки в символ или наоборот
str_char(Строка,Символ)(string,char):(i,o)(o,i)(i,i).
в) Преобразование строки в целое число или наоборот
str_int(Строка,ЦелЧисло)(string,integer):(i,o)(o.i)(i,i).
г) Преобразование строки в действительное число или наоборот
str_real(Строка,ДействЧисло)(string,real):(i,o)(o,i)(i,i).
д) Преобразование символа в число (код ASCII) или наоборот
char_int(Символ,Число)(char,integer):(i,o)(o,i)(i,i).
е) Преобразование терма заданного домена в его строковое представление
term_str(Домен, Терм, Строка)(<домен>,<терм>,string):(i,i,o).
3. Задание по лабораторной работе.
Введенную с клавиатуры строку вывести на экран дисплея наоборот.
4. Задачи по работе со строками.
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. Удалить из строки лишние пробелы (начальные, в середине строки, в конце строки).
4.19. Проверить, есть ли в строке заданное ключевое слово.
4.20. Найти в строке слова с числовыми символами.
5. Содержание отчета.
В отчете должны быть отражены следующие пункты: цель работы, постановка задачи, тексты программ, результаты тестирования, выводы.
Контрольные вопросы:
Что будет получено в качестве результата при выполнении предиката str_len с поточным шаблоном (i,i) ?
Можно ли использовать предикат concat для получения остатка строки при задании строки и ее подстроки ?
Возможно ли применение предиката frontchar со свободрыми второй и третьей переменными ?
Можно ли с помощью предиката frontchar подсоединить заданный символ к началу строки ?
Сколько имеется вариантов поточного шаблона предиката frontstr ?
Имеется строка, содержащая последовательность имен, разделенных пробелами. Какой предикат можно использовать для преобразования этой строки в список имен ?
Напишите правило преобразования строки в список атомов. Какой получится список, если в качестве входного параметра этому правилу будет передана следующая строка: “abc f17 38de, a5b”?
Назначение предиката isname.
Сколько вариантов поточного шаблона имеют предикаты преобразования типов (за исключением term_str) ? Смысл поточного шаблона (i,i) для этих предикатов.
С помощью какого предиката преобразования типов можно определить десятичный код символа ?
Есть ли стандартный предикат для преобразования целого числа в вещественное и наоборот ?
