Файл: Учебные пособия по логическому и функциональ ному программированию В. М. Зюзькова. В пособие внесены изменения в 2020 г.pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 05.12.2023
Просмотров: 166
Скачиваний: 9
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
38
Основная часть курсовой работы
В основной части должно быть решение поставленной задачи, в част- ности:
- анализ задачи;
- обоснование выбора алгоритма;
- обоснование выбора структур данных;
- описание алгоритма;
- обоснование набора тестов.
Об анализе задачи
Разработка алгоритма представляет собой задачу на построение. По- этому, как обычно в таких случаях (можно, например вспомнить о методе решения геометрических задач на построение), необходим этап анализа зада- чи. Он позволяет установить, что является входом и выходом будущего алго- ритма, выделить основные необходимые отношения между входными и вы- ходными объектами и их компонентами, выделить подцели, которые нужно достичь для решения задачи, и как следствие этого, выработать подход к по- строению алгоритма. Результатом этапа анализа задачи должна быть специ- фикация алгоритма, т. е. формулировка в самом общем виде того, что (в рам- ках выбранного подхода) должен делать алгоритм, чтобы переработать вход- ные данные в выходные.
Об описании алгоритма
Прежде всего, нужно иметь в виду, что такое описание предназначено не для машины, а для человека. Другими словами, речь идет не о программе, а о некотором тексте (т. е. о словесном описании), по которому можно полу- чить представление об общей структуре разрабатываемого алгоритма, о смысле его отдельных шагов и их логической взаимосвязи. Сохранение достаточно высокого уровня описания алгоритма также облегчает его обос- нование. Поэтому шаги алгоритма должны описываться в терминах тех объ- ектов и отношений между ними, о которых идет речь в формулировке задачи.
Например, для "геометрической" задачи шаги алгоритма следует описывать как действия над точками, прямыми и т. п., как проверки свойств типа при- надлежности трех точек одной прямой и т. п. Но не должно быть работы с ко- дами этих объектов, например с матрицей координат точек некоторого мно- жества.
При программировании на Прологе описание предикатов должно за- ключаться в указании, для каких отношений между сущностями (объектами предметной области) они введены. Какие аргументы предиката являются входными, а какие выходными? При программировании на Лиспе для описа- ния функций должно быть указано, что функция вычисляет, а не как она это делает.
39
Нужно подобрать набор тестов, достаточный для демонстрации работы программы и ее реакции на экстремальные ситуации и неправильное обраще- ние.
Правила оформления ПЗ к курсовой работе
ПЗ пишется в редакторе MS Word шрифтом Times New Roman, разме- ром 12, на формате A4. Нумерация страниц должна быть сквозной, первой страницей является титульный лист. Номер страницы проставляется вверху посередине. Заголовки разделов пишутся прописными буквами по середине текста. Заголовки подразделов пишутся с абзаца строчными буквами, кроме первой прописной. В заголовке не допускаются переносы слов. Точку в конце заголовка не ставят. Если заголовок состоит из двух предложений, то их раз- деляют точкой.
40
6. ЭКЗАМЕНАЦИОННЫЕ ВОПРОСЫ
Данные вопросы предлагаются для компьютерной автоматизированной проверки знаний студентов по дисциплинам "Логическое программирова- ние" и "Функциональное программирование".
Вопрос 1
Дана цель для интерпретатора Пролога
?- parent(X,pat).
Какое из следующих двух предложений правильно передает логический смысл этого запроса:
1) "Все ли X являются родителями Pat?"
2) "Существует ли X, который является родителем Pat?"
Варианты ответов:
1) первое предложение;
2) второе предложение;
3) оба предложения не передают логический смысл запроса;
4) оба предложения правильны.
Введите номер правильного ответа.
Вопрос 2
Дана цель для интерпретатора Пролога
?- not parent(X,pat). на которую был получен отрицательный ответ. Какое из следующих трех предложений правильно передает логический смысл этого ответа:
1) "Не существует родитель у Pat."
2) "Не все X являются родителями Pat."
3) "Есть родители, но не у Pat."
Варианты ответов:
1) первое предложение;
2) второе предложение;
3) третье предложение;
4) все три предложения не передают логический смысл ответа.
Введите номер правильного ответа.
Вопрос 3
Пусть имеется правило на Прологе 'имеет ребенка'(X):-'родитель'(X, Y).
Какое из следующих двух предложений правильно передает логический смысл этого правила:
1) "Для всех X и Y, если X - родитель Y, то X имеет ребенка."
41 2) "Для всех X, X имеет ребенка, если существует некоторый Y, такой, что X
- родитель Y."
Варианты ответов:
1) первое предложение;
2) второе предложение;
3) оба эти предложения передают логический смысл правила;
4) оба эти предложения не передают логический смысл правила.
Введите номер правильного ответа.
Вопрос 4
Пусть имеются следующие два варианта правила для предиката 'сестра'(X,Y)
- "X есть сестра Y" на Прологе (мы вкладываем естественный смысл для ис- пользуемых в правиле предикатов):
1) 'сестра'(X,Y):-'родитель'(Z,X),'родитель'(Z,Y),'женщина'(X).
2) 'сестра'(X,Y):-
'родитель'(Z,X),'родитель'(Z,Y),'женщина'(X),'различны'(X,Y).
Какое из этих правил более правильно с точки зрения логики?
Варианты ответов:
1) первое;
2) второе;
3) оба неправильны;
4) правила логически эквивалентны.
Введите номер правильного ответа.
Вопрос 5
Пусть дано отношение 'родитель' на Прологе. Определим отношение "X - родственник Y" следующим образом :
'родственник'(X,Y):-'родитель'(X,Y).
'родственник'(X,Y): - 'родитель'(Y,X).
'родственник'(X,Y):-'родственник'(X,Z),'родственник'(Z,Y).
Какие из следующих утверждений верны?
1. Одно из первых двух правил лишнее.
2. Третье правило потенциально опасное - оно может привести в некоторых запросах к бесконечной рекурсии.
3. Любой запрос к данной программе приводит к конечной работе интерпре- татора Пролога.
4. Правила неправильно задают отношение 'родственник'.
Введите через пробел номера утверждений (в порядке возрастания), которые вы считаете истинными.
Вопрос 6
Пусть, используя отношение 'предок' (см. курс лекций), введено отношение 'родственник':
42
'родственник'(X,Y):-'предок'(X,Y).
'родственник'(X,Y):-'предок'(Y,X).
'родственник'(X,Y):-'предок'(Z,X),'предок'(Z,Y).
'родственник'(X,Y):-'предок'(X,Z),'предок'(Y,Z).
Правильно ли определено отношение?
Варианты ответов:
1) да;
2) нет;
3) правильно, но при положительном ответе на некоторые ваши запросы ин- терпретатор будет повторять одинаковые ответы.
Введите номер правильного ответа.
Вопрос 7
Пусть дана программа на Прологе:
'родитель'('пам', 'боб').
'родитель'('том', 'боб').
'родитель'('том', 'лиз').
'родитель'('боб', 'энн').
'родитель'('боб', 'пат').
'родитель'('пат', 'джим').
'женщина'('пам').
'женщина'('лиз').
'женщина'('энн').
'женщина'('пат').
'мать'(X, Y):- 'родитель'(X, Y), 'женщина'(X).
'родитель родителя'(X, Y):- 'родитель'(X, Z), 'родитель'(Z, Y).
Постарайтесь понять, как Пролог выводит ответы на указанные ниже вопро- сы. Будут ли встречаться возвраты при выводе ответов на какие-либо из этих вопросов?
1) ?-'родитель'('пам', 'боб').
2) ?-'мать'('пам ', 'боб').
3) ?-'родитель родителя'('пам', 'энн').
4) ?-'родитель родителя'('боб', 'джим').
Введите последовательность из четырех ответов через пробелы в порядке ну- мерации (варианты ответов: да, нет).
Вопрос 8
Следующие выражения представляют собой правильные объекты в смысле
Пролога:
1) Diana; 2) diana; 3) 'Diana'; 4) 'Диана едет на юг'; 5) 'едет'('диана', 'юг'); 6) 45;
7) +(X,Y); 8) three(black (Kat)).
Что это за объекты (атомы, числа, переменные, структуры)?
43
Введите последовательность из 8 ответов через пробелы (ответы кодируйте числами: атом -1, число - 2, переменная- 3, структура - 4).
Вопрос 9
Пролог. Будут ли следующие операции унификации успешными или не- успешными?
1) point(A, B) = point(1, 2)
2) point(A, B) = point(X, Y, Z)
3) plus(2, 2) = X
4) +(2, D) = +(E, 2)
5) t(point(-1, 0), P2, P3) =t(point(P1, point(1, 0), point(0, Y))
Введите последовательность из пяти ответов через пробелы в порядке нуме- рации (варианты ответов: да, нет).
Вопрос 10
Пролог. При выполнении цели
?- P = point(2, X). система унифицирует X = G692, P = point(2, G692). Имя G692 - законное имя прологовской переменной, которое система построила сама во время вычис- лений. Ей приходится генерировать новые имена, для того чтобы переимено- вывать введенные пользователем переменные в программе.
В качестве объяснения этому можно предложить:
1) одинаковые имена обозначают в разных предложениях разные перемен- ные;
2) при последовательном применении одного и того же предложения исполь- зуется каждый раз его "копия" с новым набором переменных.
Вам требуется выбрать верное объяснение.
Варианты ответов:
1) первая причина правильная;
2) вторая причина правильная;
3) верны обе причины;
4) обе причины неправильны.
Введите номер правильного ответа.
Вопрос 11
Пролог. Рассмотрим следующую программу: f(1, one). f( s(1), two). f(s(s(1)), three). f(s(s(s(X))), N):- f(X, N).
Сколько ответов пролог-система даст на каждый из следующих вопросов?
1) ?- f(s(1), A).
2) ?- f(s(s(1)), two).
44 3) ?- f(s(s(s(s(s(s(1)))))), C).
4) ?- f(D, three).
Введите последовательность из четырех ваших ответов через пробелы в по- рядке нумерации (каждый ваш ответ - натуральное число, представляющее количество ответов пролог-системы на вопрос).
Вопрос 12
Дана программа на Прологе.
'большой'('медведь').
'большой'('слон').
'маленький'('кот').
'коричневый'('медведь').
'черный'('кот').
'серый'('слон').
'темный'(Z):-'черный'(Z).
'темный'(Z):-'коричневый'(Z).
В каком из следующих двух случаев системе приходится производить боль- шую работу для нахождения ответа?
1) ?- 'большой'(X), 'темный'(X).
2) ?- 'темный'(X), 'большой'(X).
Указание. Время работы оценивайте в количестве шагов; на каждом шаге вы- числяется новый список целей, список целей меняется после каждой успеш- ной унификации или возврата.
Введите номер запроса.
Вопрос 13
В Прологе функтор ''.'' с двумя аргументами можно использовать для пред- ставления списков наряду с более удобным представлением с квадратными скобками. Представьте список [1,2,3,4] с помощью функтора ".". Введите от- вет - строку символов без пробелов.
Вопрос 14
Пролог. Какое из следующих представлений списка эквивалентно представ- лению [a, b, c]?
1) [a|[b, c]]
2) [a, b| [c]]
3) [a, b, c|[]]
4) [a, .(b|[c])]
Введите последовательность из четырех ответов через пробелы в порядке ну- мерации (варианты ответов: да, нет).
45
Вопрос 15
Пролог. Какую конкретизацию получит переменная L в результате вычисле- ния цели
?- L1 = [a,b,z,z,c,z,z,z,d,e], append(L, [z,z,z|_],L1).
Введите ответ - строку символов без пробелов.
Вопрос 16
Пролог. Какую конкретизацию получит переменная L в результате вычисле- ния следующей цели?
?- append(L, [_,_,_],[a,b,c,d]).
Введите ответ - строку символов без пробелов.
Вопрос 17
Пролог. Какую конкретизацию получит переменная L в результате вычисле- ния следующей цели?
?- append([_,_,_|L], [_,_,_],[0,1,2,3,4,5,6,7]).
Введите ответ - строку символов без пробелов.
Вопрос 18
Определен следующий прологовский предикат p(X, [X]). p(X, [H|T]):- p(X, T).
Какую конкретизацию получит переменная L в результате вычисления сле- дующей цели?
?- p(L, [1,2,3,4,5]).
Введите ответ - строку символов без пробелов.
Вопрос 19
Определен следующий прологовский предикат p([], []). p([H|T], L):- p(T, L1), append(L1, [H], L).
Какую конкретизацию получит переменная L в результате вычисления сле- дующей цели?
?- p([1,2,3], L).
Введите ответ - строку символов без пробелов.
Вопрос 20
Определен следующий прологовский предикат p([H|T], L):- append(T, [H], L).
Какую конкретизацию получит переменная L в результате вычисления сле- дующей цели?
?- p([1,2,3], L).
46
Введите ответ - строку символов без пробелов.
Вопрос 21
Дана прологовская программа t(zero, 0). t(one, 1). t(two, 2). p([],[]). p([H|T], [H1|L]) :- t(H, H1), p(T, L).
Какую конкретизацию получит переменная L в результате вычисления сле- дующей цели?
?- p([one, zero, two], L).
Введите ответ - строку символов без пробелов.
Вопрос 22
Пролог. Дано определение предиката 'разбиение списка'([], [], []).
'разбиение списка'([X], [X], []).
'разбиение списка'([X, Y|T], [X| T1], [Y| T2]):- 'разбиение списка'(T, T1, T2).
Какой список получится длиннее при выполнении цели
?- 'разбиение списка'([1,2,3,4,5], L1, L2).
L1 или L2?
Варианты ответов:
1) список L1;
2) список L2;
3) списки равны по длине.
Введите номер правильного ответа.
Вопрос 23
Пролог. Определим предикат length для вычисления длины списка: length([], 0). length([_|T], N) :- length(T, N1), N is 1+N1.
Если во втором правиле в его теле поменять две цели местами, то при вызове
?- length([1, 2, 3], N). произойдет следующее:
1) интерпретатор не сможет вычислить цель, а сообщит об ошибке;
2) N получит значение равное 3;
3) цель успешно вычислится, но N в качестве значения получит не число;
4) интерпретатор ответит: No.
Введите номер правильного ответа.
47
Вопрос 24
Пролог. Определим предикат length для вычисления длины списка: length([], 0). length([_|T], N) :- length(T, N1), N = 1+N1.
При вызове
?- length([1, 2, 3], N). произойдет следующее:
1) интерпретатор не сможет вычислить цель, а сообщит об ошибке;
2) N получит значение равное 3;
3) цель успешно вычислится, но N в качестве значения получит не число;
4) интерпретатор ответит: No.
Введите номер правильного ответа.
Вопрос 25
Пролог. Определим предикат length для вычисления длины списка: length([], 0). length([_|T], N) :- N = 1+N1, length(T, N1),
При вызове
?- length([1, 2, 3], N). произойдет следующее:
1) интерпретатор не сможет вычислить цель, а выдает сообщение об ошибке;
2) N получит значение равное 3;
3) цель успешно вычислится, но N в качестве значения получит не число;
4) интерпретатор ответит: No.
Введите номер правильного ответа.
1 2 3 4 5 6