МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ ЮГОРСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ УТВЕРЖДАЮ Директор Института (НОЦ) систем управления и информационных технологий ____________ Тей Д.О. "_____"__________________20__ г. Методические указания по проведению лабораторных работ Системы искусственного интеллекта Вариативная часть Б1. ДВ 7 09.03.04 Программная инженерия Ханты-Мансийск 2015 год Лабораторная 1. Построение дерева целей. Для работы надо разбиться на команды по 2-3 человека. Каждой команде надо построить дерево целей для задачи «Компьютер сломался. Что делать?». Критерии оценки: 1. Количество найденных неисправностей. 2. Количество найденных ошибок в работе «системы» у других групп студентов. 3. Как система ведет себя в случае не опознанной ошибки. (Должна отправить к специалисту). Лабораторная 2. Основы работы со средой Visual Prolog. Структура программы. 1. Создайте и сохраните новый проект. Добавьте в него модуль с кодом из Примера №1. Измените параметры редактора (шрифт - кириллица). Установите в свойствах проекта использование не детерминированных предикатов. Запустите интерпретатор для модуля с кодом Примера №1. Измените текст программы и запустите ее для вывода результатов закомментированных целей. 2. Измените программу таким образом, чтобы были учтены факты: 1. Саша сын Вовы. 2. Вова мужчина. Сформулируйте цель для нахождения ответа на вопросы: 1. "Является ли Саша мужчиной?" 2. "Чей сын Саша?" 3. Определите и опишите предикат-правило "Внук". Сформулируйте цель для нахождения ответа на вопрос: "Кто внук Саши?" 4. Измените предикаты "родственник" и "вопрос" таким образом, чтобы они учитывали возможность нахождения внука. 5. Добавьте в проект модуль с кодом из Примера №2. Добавьте цель для ответа на вопрос: 1. Является ли Пупкин студентом? 6. Добавьте цель для ответа на вопрос: 1. Какие оценки и по каким предметам имеет Митрофанов? 7. Добавьте цель для ответа на вопросы: 1. Есть ли у Табуреткиной оценка 2? 8. Добавьте цель для ответа на вопрос: 1. Кто имеет 5 по Матану? 9. Добавьте цель для определения фамилии и имени всех студенток. 10. Добавьте цель для определения одногруппников Аграфеновой. 11. Добавьте предикат, который бы позволил учитывать следующие факты: 1. Лектор по СИИ - это Тьюринг. 2. Лектор по СПО - это Гейтс. 3. Лектор по Физике - это Ломоносов. 4. Лектор по Матану - это Коши. 5. Лектор по Алгебре - это Крамер. Задайте цель для определения списка всех лекторов. 12. Добавьте цель для определения фамилий студентов, кто получил 5 у Тьюринга. 13. Добавьте цель для определения фамилий и имен студентов, кто получил 5 у Тьюринга. Лабораторная 3. Решение типовых задач на родственные отношения Задать генеалогическое дерево согласно рисунку из файла Пример №3 с помощью предикатов: Ребенок, Человек и Муж (на схеме это отношение помечено пунктиром). Список заданий: 1. Определить предикат Свекровь(мать мужа). 2. Определить предикат Племянник (сын брата или сестры). 3. Определить предикат Внучатый_Племянник (внук брата или сестры). 4. Определить предикат Единокровный_брат (только по отцу). 5. Определить предикат Мачеха (жена отца, но не мать). 6. Определить предикат Общий_ребенок (общий ребенок мужа и жены). 7. Определить предикат Несовершеннолетний_внук (внук младше 14 лет). Лабораторная 4. Вычисления в Prolog. Основы рекурсии. Описание упражнения: Ознакомьтесь с примером программы для вычисления факториала (см. Пример №4). Список заданий: 1. Определить предикат для решения квадратного уравнения. 2. Определить предикат для вычисления функции: 3. Определить предикат для вычисления произведения: 4. Определить предикат для вычисления n-го числа Фиббоначи (первые два равны 1, а начиная с третьего, равно сумме двух предыдущих чисел Фиббоначи). 5. На основании генеалогического дерева из лабораторной работы №2 определите предикат Предок. 6. Определите предикат Предок_по_отцовской_линии. 7. Определите предикат Предок-мужчина. Лабораторная 4. Основные приемы работы со списками. Описание упражнения: Ознакомьтесь с теоретическим материалом по теме Списки. Список заданий: 1. Определить предикат, позволяющий проверить принадлежность элемента списку. 2. Определить предикат, вычисляющий количество положительных элементов списка целых чисел. 3. Определить предикат, вычисляющий сумму положительных элементов списка целых чисел. 4. Определить предикат, печатающий элемент списка по его номеру. 5. Определить предикат, печатающий номер элемента в списке. 6. Определить предикат, вычисляющий максимальный элемент списка. 7. Определите предикат, который увеличивает элементы исходного списка на единицу. 8. Определите предикат, заменяющий в исходном списке все вхождения заданного значения другим. 9. Определите предикат, порождающий по заданному натуральному числу N список, состоящий из натуральных чисел от N до 1 (по убыванию). 10. Определите предикат, порождающий по заданному натуральному числу N список, состоящий из N случайных натуральных чисел из промежутка от 1 до 100 (используйте предикат Random). Лабораторная 5. Конкатенация. Преобразование списков. Список заданий: 1. Определить предикат, присоединяющий один список к другому (предикат конкатенации списков). 2. На основе предиката конкатенации создайте предикат, который определяет элементы стоящие слева (или справа) от заданного. 3. На основе предиката конкатенации создайте предикат, который определяет последний элемент списка. 4. На основе предиката конкатенации создайте предикат, который определяет предпоследний элемент списка. 5. На основе предиката конкатенации создайте предикат, который обращает список (записывает в обратном порядке). 6. Определить предикат, удаляющий элемент из списка. 7. Определить предикат, сортирующий список простым выбором (минимальный помещается в начало). Используйте созданные ранее предикаты для определения минимального элемента и удаления элемента из списка. 8. Создайте предикат, переводящий список цифр от 0 до 9 в список соответствующих им названий (строк). Лабораторная 6. Работа со строками. Описание упражнения: Изучите справку для встроенных предикатов обработки строк. str_len(String строка, Integerколичество_символов_в_строке), определяет длину строки. сoncat(String строка1, String строка2, String конкатенация_строки1_и_строки2) соединяет две строки. frontchar(String исходная_строка, Char первый_символ_исходной_строки, String исходная_строка_без_первого_символа) разделяет строку на первый символ и «хвост». frontstr(Integer N_количество_отделяемых_символов, String исходная_строка, String первые_N_символов_исходной_строки, String исходная_строка_без_первых_N_символов) отделяет от исходной строки первые N символов. fronttoken(String исходная_строка, String первое_слово_исходной_строки, String исходная_строка_без_первого_слова) разделяет строку на первое слово и «хвост». Список заданий: 1. Используя созданные Вами ранее и встроенные предикаты работы со строками, определите предикат для вычисления количества слов в строке (без знаков препинания). 2. Определить предикат, считающий количество латинских букв в строке. 3. Определить предикат, считающий количество гласных букв в строке. 4. Определить предикат, считающий в строке количество слов, начинающихся с буквы «Б». 5. Определить предикат, считающий количество различных символов в строке. 6. Определить предикат, проверяющий является ли строка палиндромом. 7. Определить предикат, подсчитывающий количество палиндромов в строке. 8. Определить предикат, находящий самое длинное слово в строке.