Лабораторная работа состоит из трех индивидуальных заданий на программирование на языке ПРОЛОГ и нескольких общих упражнений, которые приведены ниже и которые преподаватель уточняет на лекциях.
ЗАДАНИЕ N1 Отношения между объектами. (на Прологе и Паскале)
4.1.1. Методические указания
В практическом плане:
· определить заданное сложное отношение через заданные простые отношения средствами языка ПРОЛОГ;
· сформировать базу данных (явное задание) для простых отношений (база должна быть достаточно представительной для демонстрации возможностей программы);
· не использовать отсечение и предикаты ввода-вывода;
· протестировать целевой и другие предикаты, получить явные задания отношений, построить различные сечения отношений;
· если ответ на запрос содержит повторяющиеся значения, определить дополнительный предикат, содержащий вызов предиката типа findall, setof (см упражнение 3.9.2);
· для сравнения - написать программу на языке PASCAL (или другом процедурном языке), которая частично реализует те же функции.
В теоретическом плане:
Ø записать словесную интерпретацию правил ПРОЛОГ- программы;
Ø записать программу посредством формул логики предикатов.
Ø сравнить программы (ПРОЛОГ и PASCAL) по критериям:
§ пользовательские возможности;
§ возможности модификации;
§ объем текста программ;
§ трудозатраты;
§ и другие.
4.1.2. Варианты
1. Определены предикаты: студент(X,Y) - студент, обучающийся в данной группе; преподаватель(X,Y) - преподаватель, который ведет данный предмет; предмет(X,Y) – предмет, который преподается в данной группе. Определите предикат студент_обучающийся_у_преподавателя(X,Y).
- Определены предикаты: мужчина(X); женщина(X); родитель(X,Y). Определите следующие предикаты тетя(X,Y); братья(X,Y).
- Определены предикаты: отец(X,Y); мать(X,Y); мужчина(X); женщина(X). Определите предикаты: двоюродные_братья(X,Y); племянник(X,Y); внук(X,Y); внучка(X,Y).
- Определены предикаты: отец(X,Y); мать(X,Y); мужчина(X); женщина(X); муж_жена(X,Y). Определите предикаты тесть(X,Y); теща(X,Y); сват(X,Y).
- Определены предикаты: отец(X,Y); мать(X,Y); мужчина(X); женщина(X); муж_жена(X,Y). Определите предикаты троюродные_братья(X,Y); племянник(X,Y).
- Определены предикаты: отец(X,Y); мать(X,Y); мужчина(X); женщина(X). Определите предикаты: внучатый_племянник(X,Y), внучатая_племянница(X,Y)..
- Определены предикаты: отец(X,Y); мать(X,Y); мужчина(X); женщина(X). Определите предикаты сводные_братья(X,Y); сводные_братья_или_сестры(X,Y).
- Определены предикаты: отец(X,Y); мать(X,Y); мужчина(X); утверждает(X,Y) (X утверждает, что Y – убийца). Определите предикат: убийца(X). X - убийца, если это утверждают Y и Z, которые являются двоюродными братьями.
- Определены предикаты: отец(X,Y); мать(X,Y); мужчина(X); женщина(X); знакомы(X,Y). Определить предикат: люди_одного_круга(X,Y), если X,Y - братья, или сестры, или они знакомы, или их родители знакомы.
- Определены предикаты: станция_назначения(X,Y); станция_отправления(X,Y); промежуточная_станция(X,Y). (X - станция, Y- поезд). Определить предикат пересадочная_станция (X,Y,Z) для поездов X и Y, который истинен, если поезда следуют через одну промежуточную станцию Z, или станция назначения Z одного поезда является станцией отправления Z другого.
- Определены предикаты: отец(X,Y); мать(X,Y); мужчина(X); женщина(X); муж_жена(X,Y). Определить предикат однокровные(X,Y), если у них общий прадедушка.
- Определены предикаты: мужчина(X); женщина(X); родитель(X,Y). Определить отношение прямой_родственник(X,Y). X – прямой родственник Y, если X - отец, мать, дедушка, бабушка, брат или сестра Y.
- Определены предикаты: мужчина(X); женщина(X); родитель(X,Y). Определить предикаты: тесть(X,Y); теща(X,Y); свекр(X,Y); свекровь(X,Y).
- Определены предикаты: сессия(V,W,X,Y,Z) (V,W,X,Y,Z - названия предметов сессии); экзамен(X,Y,Z) (студент X сдал предмет Y с оценкой Z). Определить предикаты: отличник(X) (студент X сдал все экзамены сессии на "отлично"); двоечник(X) (студент X сдал какой-либо из экзаменов сессии на"неуд").
- Определены предикаты: мужчина(X); женщина(X); родитель(X,Y); муж_жена(X,Y). Определить отношения тесть(X,Y), теща(X,Y).
- Определены предикаты: мужчина(X); женщина(X); родитель(X,Y); муж_жена(X,Y). Определить отношения золовка(X,Y), своячница(X,Y).
- Определены предикаты: мужчина(X); женщина(X); родитель(X,Y); муж_жена(X,Y). Определить отношения кузены(X,Y), кузины(X,Y).
- Определены предикаты: мужчина(X); женщина(X); родитель(X,Y); муж_жена(X,Y). Определить предикат двоюродная_бабушка(X,Y).
- Определены предикаты: имеет_специальность(X,Y); муж_жена(X,Y). Определить предикат имеют_общие_интересы(X,Y). X и Y имеют общие интересы, если они коллеги или их жены (мужья) коллеги.
- Определены предикаты: занимается_спортом(X,Y); имеет_специальность(X,Y). Определить предикат имеют_общие_интересы(X,Y). X и Y имеют общие интересы, если они коллеги или занимаются одним видом спорта.
- Определены предикаты: мужчина(X); женщина(X); родитель(X,Y); муж_жена(X,Y). Определить отношение шурин(X,Y).
- Определены предикаты: мужчина(X); женщина(X); родитель(X,Y); нравится(X,Y). Определить отношение близкие_по_духу(X,Y), если существует нечто, что обоим нравится, либо они братья или сестры.
- Определены предикаты: мужчина(X); женщина(X); родитель(X,Y); профессия (X,Y). Определить отношение связаны_общим_интересом(X,Y). X и Y связаны общим интересом, если у них одна и та же профессия или их жены - родные сестры.
- Определены предикаты: нравится(X,Y), вор(X), дефицитная вещь(X), милиционер(X), не_боится(X,Y). Определить отношение: мог_украсть(X,Y). .X мог украсть Y, если X - вор и Y - есть вещь, которая нравится X или если Y - дефицитная вещь, а Z - милиционер, причем X не боится Z.
- Определены предикаты: студент(X,Y) - студент, обучающийся в данной группе; предмет(X,Y) – предмет, по которому данная группа сдает экзамен. Определить отношение: экзамен(X,Y), студент X сдает экзамен по дисциплине Y, если он учится в группе, которая сдает экзамен по этой дисциплине.
- Определены предикаты: студент(X,Y) - студент, обучающийся в данной группе; преподаватель(X,Y) – преподаватель, который читает лекции в данной группе. Определить отношение: лекции(X,Y), студент X слушает лекции преподавателя Y, если он учится в группе, которой читает лекции данный преподаватель.
- Определены предикаты: студент(X,Y) - студент, обучающийся в данной группе; присутствовал(X,Y) – студент, который присутствовал на занятиях в данный день. Определить отношение: встретились(X,Y,Z), два студента X,Y встретились в некоторый день Z, если они учатся в одной группе и оба присутствовали на занятиях в этот день.
- Определены предикаты: дорога(X,Y) - дорога, включает данную станцию; станция(X,Y) – станция, на которую данный поставщик поставляет груз. Определить отношение: поставщик(X,Y), поставщик поставляет груз на дорогу, если он поставляет груз на какую-либо станцию этой дороги.
- Определены предикаты: дорога(X,Y) - дорога, включает данную станцию; отправляет(X,Y) – станция, на которую данное предприятие поставляет груз; получает(X,Y) – станция, от которой данное предприятие получает груз. Определить отношение: является_клиентом(X,Y), предприятие является клиентом дороги, если оно отправляет или получает грузы с какой-либо станции этой дороги.
- Определены предикаты: нравится(X,Y). Определить отношение любит(X,A). X любит все то, что нравится Y и Z, или любит P, которому нравятся цветы.
ЗАДАНИЕ N2. Работа со списками
4.2.1. Методические указания
В практическом плане:
· определить заданное отношение между списками и их элементами средствами языка ПРОЛОГ;
· не использовать предикаты ввода-вывода;
· не использовать сложные встроенные предикаты, выполняющие специфические операции над списками;
- протестировать целевой и другие предикаты, получить явные задания отношений, построить различные сечения отношений;
- при невозможности построить сечение, необходимо объяснить причину.
В теоретическом плане:
Ø записать словесную интерпретацию правил ПРОЛОГ- программы;
Ø записать программу посредством формул логики предикатов.
4.2.2. Варианты
- Даны списки целых чисел L1, L2. Построить список L3, состоящий из элементов списка L1, к которому добавлены все элементы списка L2, не входящие в L1.
- Даны списки целых чисел L1, L2. Построить список L3 по следующему правилу: если L1 является подсписком L2, то из L2 исключить L1; в противном случае присоединить L1 к L2.
- Множества заданы списками целых чисел L1 и L2. Получить в виде списка L3 множество, представляющее собой объединение множеств L1 и L2.
- Множества заданы списками целых чисел L1 и L2. Получить в виде списка L3 множество, представляющее собой пересечение множеств L1 и L2.
- Множества заданы списками строк L1 и L2. Получить в виде списка L3 множество L1\L2.
- Дан список L1, элементом которого являются списки целых чисел. Построить список L2, изменив порядок элементов в L1 на обратный, и изменить порядок на обратный в каждом подсписке.
- Дан список литер L1. Построить список L2, исключив из L1 все повторяющиеся литеры.
- Даны списки литер L1 и L2. Построить список L3 по следующему правилу: если L1 является префиксом L2, то исключить этот префикс и добавить его в качестве суффикса; в противном случае - присоединить к L1 список L2.
- Дан список литер L. Исключить из списка все строчные литеры.
- Дан список L. Если длина списка нечетна, то напечатать центральный элемент. В противном случае распечатать первую половину списка.
- Дан список L. Если длина списка нечетна, построить список L1, поменяв местами левую и правую часть списка, в противном случае оставить список без изменения.
- Даны два списка символов L1, L2. Если L1 есть подсписок L2, то определить следующий после L1 элемент списка L2, иначе ответом является слово no.
- Список чисел разделить на 3 списка: числа, меньшие данного числа; равные данному; большие данного.
- Даны два упорядоченных списка. Образовать из элементов этих списков новый список, также упорядоченный.
- Из двух списков чисел извлечь общие числа, большие данного и поместить их в третий список.
- В списке L1 найти элементы, имеющиеся в списке L2 и заменить их на элементы из списка L3 по номеру соответствующего элемента из списка L2.
- В списке L1 найти элементы, имеющиеся в списке L2 и заменить их на элементы из списка L3 по номеру соответствующего элемента из списка L1.
- В списке L1 найти элементы, имеющиеся в списке L2 и заменить их на элементы из списка L3 по номеру соответствующему количеству произведенных замен.
- Имеется список слов. Составить список различных слов данного списка с указанием частоты их появления в нем.
- Реализовать операции вставки и удаления записей из упорядоченного списка.
- Отсортировать список, используя метод вставки.
- Осуществить процедуру слияния двух упорядоченных списков.
- Переупорядочить элементы списка так, чтобы вначале шли все отрицательные элементы, а затем все неотрицательные элементы.
- Реализовать операцию поиска максимального элемента списка методом турнира. На каждом этапе попарного сравнения формируется новый список.
- Имеется два упорядоченных списка. Определить принадлежат ли все элементы второго списка первому списку.
26. Удалить из списка все элементы, принадлежащие второму списку.
- Элементы списка представляют собой слагаемые многочлена (если коэффициент при степени 0, то элемент в списке отсутствует). Выполнить операцию сложения двух многочленов, представленных списками.
- Множества целых чисел заданы списками L1, L2, L3. Построить список L4, представляющий собой пересечение множеств L1, L2, L3.
- Даны списки L1,L2,L3. Если L1 является префиксом L2, а L3 - суффиксом L2, то ответ yes, иначе - no.
- Даны списки L1, L2, L3. Если конкатенация L1 и L2 - есть префикс L3, то ответ - yes, иначе - no.
- Даны списки L1, L2, L3. Если L1 и L2 являются подсписками L3, то сформировать новый список, удалив из L3 подсписки L1 и L2, в противном случае оставить L3 без изменения.
- Имеется два списка. Определить является ли первый список подсписком второго.
4.3. ЗАДАНИЕ N3. Разные задачи
4.3.1. Методические указания
В теоретическом плане:
Ø сформулировать цель задачи в виде отношения между входными и выходными данными;
Ø записать словесную интерпретацию правил ПРОЛОГ- программы;
Ø записать программу посредством формул логики предикатов.
В практическом плане:
· определить отношение между входными и выходными данными средствами языка ПРОЛОГ;
- протестировать целевой и другие предикаты, получить явные задания отношений.
4.3.2. Варианты
- Напишите программу решения числового ребуса вида . Задача состоит в том. чтобы заменить буквы D, О, N и т.д. на цифры таким образом, чтобы вышеприведенная сумма была правильной. Разным буквам должны соответствовать разные цифры.
- Напишите программу для упрощения алгебраических сумм, в которых участвуют числа и переменные (строчные буквы). В выдаваемом результате требуется, чтобы переменные предшествовали числам, одинаковые переменные приводились как подобные члены, числовые слагаемые складывались.
- Дано положение коня на шахматной доске. Определить минимальный путь коня в заданную точку.
- Дано положение слона на шахматной доске. Определить минимальный путь слона в заданную точку при наличии на доске запрещенных полей.
- Напишите программу "Ханойские башни".
- Напишите программу решения задачи о восьми ферзях.
- Написать программу ввода и вычисления арифметического выражения (операнды - целые числа).
- Написать программу символьного умножения двух многочленов от одной переменной.
- Написать программу интерпретации (вычисления) польской инверсной записи арифметического выражения (операнды - целые числа).
- Написать программу символьного дифференцирования многочлена от одной переменной.
- Написать программу вычисления значения логического выражения в дизъюнктивной нормальной форме.
- Напишите программу, распознающую дизъюнктивную нормальную форму формулы логики высказываний.
- Напишите программу, которая преобразует префиксную запись арифметического выражения в инфиксную, с учетом того, что знак умножения может быть опущен.
- Написать программу перемножения двух многочленов от n переменных.
- Написать программу символического дифференцирования многочлена от n переменных.
- Написать программу символического дифференцирования дробно-рациональной функции.
- Написать программу символического дифференцирования произвольного алгебраического выражения (операции + - * /).
- Написать программу символического дифференцирования выражения, включающего тригонометрические функции (операции + -).
- Написать программу вычисления значения логического выражения в конъюнктивной нормальной форме.
- Напишите программу, распознающую конъюнктивную нормальную форму.
21. Напишите программу, определяющую является ли данное выражение правилом языка Пролог.
- Напишите программу, которая читает символьную запись многочлена от одной переменной, список значений коэффициентов, значение переменной и вычисляет значение многочлена.
- Напишите программу, моделирующую работу недетерминированного конечного автомата.
- Напишите программу, которая имитирует игру "Крестики-нолики".
- Напишите программу, которая имитирует игру "Пятнадцать" ("Восемь").
- Напишите программу, которая имитирует игру "12 палочек" (на каждом шаге можно взять 1,2 или 3, проигрывает тот, кто берет последнюю).
- На шахматной доске расположены белые и черные ферзи, ладьи, кони и слоны. Могут ли Белые безнаказанно взять фигуру Черных.
- Написать программу интерпретации (вычисления) триадной записи программы (предусмотреть арифметические операции и присваивание).
- Напишите программу, которая имитирует игру "Быки и коровы".
30. Напишите программу решения следующей логической головоломки.
Три друга заняли первое, второе и третье места в соревнованиях. Друзья - разной национальности, зовут их по-разному, и любят они разные виды спорта.
Майкл предпочитает баскетбол и выступил лучше чем американец. Израильтянин Саймон выступил лучше теннисиста. Игрок в крикет занял первое место.
Кто является австралийцем? Каким спортом занимается Ричард?
4.4. Содержание отчета
- Титульный лист.
- Содержание (содержит названия всех последующих пунктов)
- ЗАДАНИЕ N1. Отношения между объектами.
- Постановка задачи (копия задания)
- Авторское понимание задачи (более детальное изложение возможностей программы своими словами)
- Теоретический раздел
- Текст(ы) программы(мм)
- Результаты тестирования программы(мм)
- Выводы по заданию 1.
- ЗАДАНИЕ N2. Работа со списками.
- (Аналогично)
- ЗАДАНИЕ N3. Разные задачи.
- (Аналогично)
- Упражнения.
- ОБЩИЕ ВЫВОДЫ
- ИСПОЛЬЗОВАННАЯ ЛИТЕРАТУРА
ЛИТЕРАТУРА
1. Ч. Чень, Р. Ли Математическая логика и автоматическое доказательство теорем, М.: Наука, 1983.
2. Лавров И.А., Максимова Л.Л. Задачи по теории множеств, математической логике и теории алгоритмов, 3-е изд. - М.: Наука, 1995.
3. Братко И. Программирование на языке Пролог для искусственного интеллекта: Пер. с англ. -М.: Мир, 1990.- 560 с., ил.
4. Морозов М.Н. Логическое программирование. ПРОЛОГ. Kурс лекций.- http://www.marstu.mari.ru:8101/mmlab/home/prolog/study_l.html # LEC.- 2001.
5. Задача Альберта Эйнштейна. - http://ruslit.ioso.ru/puzzle_en.htm
если множество М – конечно, то можно просто перебрать все его значения и для каждого из них вычислить истинностное значение F, если же множество М – бесконечно, то вычисление истинностного значения представляет собой проблему, которая в общем виде неразрешима, а в каждом конкретном случае может представлять значительные трудности принципиального характера[1]