
- •1.1 Знакомство с интерпретатором Hugs.
- •1.2 Выполнение математических операций в интерпретаторе.
- •1.3. Простейшие генераторы списков.
- •1.4 Логические функции, функции сравнения, функции работы с перечислимыми типами данных.
- •1.5 Простейшие списочные и кортежные функции.
- •Задание на лабораторную работу №1.
- •Вариант 1.
- •Вариант 2.
- •Вариант 3.
- •Вариант 4.
- •Вариант 5.
- •Вариант 6.
- •Вариант 7.
- •Вариант 8.
- •Вариант 9.
- •Вариант 10.
- •Пример выполнения лабораторной работы 1.
- •Лабораторная работа 2. Создание простейших рекурсивных программ. Функции работы со строками и множествами. Сообщения об ошибках и преобразования типов.
- •2.1 Создание простейших рекурсивных программ.
- •2.2 Функции работы со строками и множествами.
- •2.3 Сообщения об ошибках и преобразования типов
- •Задание на лабораторную работу 2.
- •Вариант 1.
- •Вариант 2.
- •Вариант 3.
- •Вариант 4.
- •Вариант 5.
- •Вариант 6.
- •Вариант 7.
- •Вариант 8.
- •Вариант 9.
- •Вариант 10.
- •Пример выполнения работы
- •Лабораторная работа 3. Функции высших порядков.
- •Задание на лабораторную работу 3.
- •Вариант 1.
- •Вариант 2.
- •Вариант 3.
- •Вариант 4.
- •Вариант 5.
- •Вариант 6.
- •Вариант 7.
- •Вариант 8.
- •Вариант 9.
- •Вариант 10.
- •Лабораторная работа 4. Текстовые файлы. Факторизация, простые числа, разные задачи.
- •4. 1 Работа с текстовыми файлами в Haskell
- •Задание на лабораторную работу 4.
- •Вариант 1.
- •Вариант 2.
- •Вариант 3.
- •Вариант 4.
- •Вариант 5.
- •Вариант 6.
- •Вариант 7.
- •Вариант 8.
- •Вариант 9.
- •Вариант 10.
- •Лабораторная работа 5. Управление выводом в Прологе. Простейшие рекурсивные программы.
- •5.1 Факты и правила. База знаний. Запросы.
- •5.2 Управление выводом.
- •5.3 Рекурсия
- •Задание на лабораторную работу 5.
- •Вариант 1
- •Вариант 2
- •Вариант 3
- •Вариант 4
- •Вариант 5
- •Вариант 6
- •Вариант 7
- •Вариант 8
- •Вариант 9
- •Вариант 10
- •Лабораторная работа №6. Работа со списками в Прологе.
- •6.1 Списки в Прологе.
- •6.2 Алгоритмы обработки списков
- •6.3 Алгоритмы сортировки
- •Лабораторная работа № 7. Решение логических задач на Прологе.
- •Пример выполнения работы.
- •Лабораторная работа № 8.
1.3. Простейшие генераторы списков.
В языке Haskell существует очень удобный инструмент – генератор списков. Представим себе ситуацию, что ваша функция должна принимать в качестве входного аргумента список первых ста натуральных чисел. Согласитесь, что вводить этот список вручную при каждом запуске программы дело очень трудоёмкое. В Haskell достаточно в этом случае указать первый и последний элементы списка, а между ними записать две точки. Списки в Haskell заключаются в квадратные скобки. Ниже показан пример получения списка первых десяти натуральных чисел:
.
Задавать таким образом можно даже
бесконечные списки, достаточно не
указывать последний элемент списка. Но
в этом случае придется принудительно
вызывать остановку программы нажатием
вот этой кнопки на панели слева
.
В примере ниже показаны только две
строчки бесконечного списка:
.
Можно генерировать не обязательно подряд идущие числа. Если в начале списка указать через запятую два числа, то программа будет генерировать арифметическую прогрессию с первым членом равным первому числу и разностью равной разности между первым и вторым числом. При этом последнее число, заданное после двух точек понимается как граница - последним в списке будет член прогрессии, не превосходящий заданного последнего числа:
.
Последовательности чисел более сложного
вида, чем арифметическая прогрессия
тоже можно получать с помощью генератора
списков. Если элемент последовательности
выражается какой либо формулой
в зависимости от номера, следует писать
так: [f(n) |
n<-[1..]]. Также в такой
записи можно указать последний номер
элемента, чтобы список не был бесконечным.
Например, список квадратов первых 10
натуральных чисел:
.
Можно получать не только числовые списки, но и списки любой структуры. Например, вот список кортежей, содержащий нотации полей шахматной доски:
.
С помощью генератора списков легко можно получать всевозможные перестановки и подмножества заданного множества элементов. Например, если требуется найти все «слова» длины 3, состоящие из букв слова «HELLO», то следует написать:
Если нас не устраивают повторяющиеся «слова», достаточно применить функцию nub, которая удаляет из списка одинаковые элементы. Так как функция определена в модуле List, не забываем предварительно подключить этот модуль:
Вообще в генераторе списков можно через запятую перечислять любые условия на элементы списка. Например, если требуется получить все тройки натуральных чисел, дающих в сумме 15, можно написать так:
1.4 Логические функции, функции сравнения, функции работы с перечислимыми типами данных.
В Haskell имеется булевский тип данных, обозначаемый Bool. К этому типу принадлежат два значения True и False, соответствующие, как легко догадаться, истине и лжи. Из логических функций в Haskell имеются not, && и ||, соответствующие отрицанию, конъюнкции и дизъюнкции. Другие же логические функции можно выразить через эти три. Но тут есть маленькие хитрости, позволяющие пойти более простым путем. Сначала упомянем функции сравнения, они имеют обычный математический смысл:
< - меньше
> - больше
== - равно
/= - не равно
>= - не менее
<= - не более.
Теперь поясним, как можно с помощью функций сравнения выразить некоторые другие логические операции. Эквивалентность достаточно заменить сравнением на равенство, сумму по модулю 2 ( исключающее «или») сравнением на неравенство. Импликацию же оказывается можно заменить сравнением «не более». Дело в том, что булевский тип данных у нас перечислимый, то есть, определен четкий порядок перечисления данных этого типа. А именно, значение False идет раньше значения True. Импликация должна принимать ложное значение, только если первый аргумент True, а второй False. Но именно в этом случае сравнение True<=False даст в результате ложь, а во всех остальных случаях результатом будет истина.
Приведем еще несколько функций для работы с упорядоченными и перечислимыми типами данных.
Табл. 1.2 Функции работы с упорядоченными и перечислимыми типами
Описание |
Имя функции |
Пример |
Примечание |
Максимум из двух значений |
max |
|
|
Минимум из двух значений |
min |
|
|
Предыдущее значение |
pred |
|
может вызвать ошибку времени выполнения, если значение наименьшее из возможных |
Последующее значение |
succ |
|
может вызвать ошибку времени выполнения, если значение наибольшее из возможных |