
- •27. Управление программой. Внутренние подпрограммы унификации Пролога.
- •28. Структура программ на Прологе. Предикаты и утверждения.
- •29. Арифметика в Прологе.
- •30. Программирование повторяющихся операций. Повторение и откат.
- •31. Методы повторения. Методы организации рекурсии.
- •32. Списки в Прологе. Применение списков в программе.
- •34. Использование метода с разделением списка на голову и хвост. Компоновка данных в список.
- •34. Присваивание переменным строковых значений. Конкатенация строк. Преобразование данных.
- •35 Создание символьных префиксов. Преобразование строк в список символов.
- •38. Преобразование строк в списки атомов с функторами.
- •39.Предикаты Пролога для работы с файлами. Использование предикатов для работы с файлами.
- •40. Программы для обработки файлов.
- •41. Дозапись данных в файл
- •42. Использование файлов прямого доступа
- •43. Использование предикатов для работы с окнами. Использование окон для ввода вывода.
- •44. Использование графики в программе. Использование графики черепашки.
- •45.Использование звук и музыки.
- •46.Базы данных в Прологе. Предикаты динамической базы данных в Прологе.
- •47. Создание базы данных, располагающейся в оперативной памяти.
- •48. Создание базы данных, располагающейся на диске
- •49. Принципы построения экспертных систем
- •50.Методы вывода и система пользовательского интерфейса эс.
- •51.Экспертные системы, базирующиеся на правилах.
- •52.Экспертные системы, базирующиеся на логике.
34. Использование метода с разделением списка на голову и хвост. Компоновка данных в список.
Турбо-Пролог позволяет отделять от списка первый элемент и обрабатывать его отдельно. Данный метод работает вне зависимости от длины списка, до тех пор, пока список не будет исчерпан. Этот метод доступа к голове списка называется методом разделения списка на голову и хвост.
Применения метода по отношению к списку [4,-9,5,3]. В этом исходном списке головой является элемент 4, а хвостом – список [-9,5,3]. Головой нового списка будет уже число -9, хвостом- список [5,3]. Этот список также имеет голову (5) и хвост ([5]). Наконец, список [3] состоит из головы - числа 3 и хвоста, являющегося пустым списком. Как Вы скоро увидите, неоднократное разделение списка на голову и хвост играет важную роль в программировании на Турбо-Прологе.
Операция деления списка на голову и хвост обозначается при помощи вертикальной черты (|):
[Head|Tail].
Head здесь является переменной для обозначения головы списка, переменная Tail обозначает хвост списка. (Для имен головы и хвоста списка пригодны любые допустимые Турбо-Про-
логом имена.)
Компоновка данных из БД в список.
Турбо-Пролог содержит встроенный предикат findall. Требуемый список представляется означенной переменной, являющейся одним из объектов предиката.
Предописание встроенного предиката findall выглядит следующим образом:
findall(Variable_name,Predicate_expression,List_name).
Variable_name обозначает здесь объект входного предиката Predicate_expression, а List_name является именем переменной выходного списка. Переменная должна относиться к домену списков, объявленному в разделе domains.
Для пояснения только что сказанного рассмотрим предикат базы данных football(name,points).
Этот предикат порождает 5 утверждений :
football("Ohio State",116.0).
football("Michigan",121.0).
football("Michigan State",114.0).
football("Purdue",99.0).
football("UCLA",122.0).
Эти утверждения содержат сведения об очках, набранных командами. Сбор очков в список осуществляется при помощи встроенного предиката findall:
findall(Points,football(_,Points),Point_list)
Здесь Poits является свободной переменной для значений набранных командами очков, а Point_list - списочной переменной, элементы которой принадлежат к тому же домену, что и Points, в данном случае, к домену real. Сама работа предиката скрыта от глаз пользователя. В нашем примере findall просматривает все утверждения с предикатом football, начиная с первого. Значение переменной Points (116), взятое из этого утверждения, присваивается голове списка Point_list. Остальные значения Points помещаются в список на последующие позиции. По завершению работы findall переменная Point_list принимает значение [116.0,121.0,114.0,99.0,122.0].
34. Присваивание переменным строковых значений. Конкатенация строк. Преобразование данных.
При программировании на Турбо-Прологе символы могут быть "записаны" при помощи их кодов ASCII. Обратный слэш (\), непосредственно за которым следует десятичный код ASCII (N) символа,
интерпретируется как символ. Для представления одиночного символа выражение \N должно быть заключено в одиночные кавычки ('\N'). Для представления строки символов их коды ASCII помещаются друг за другом, и вся строка заключается в двойные кавычки ("\N\N\N").
Строка символов может быть присвоена переменной. Таким образом, следующие присваивания эквивалентны:
S = "\84\117\114\98\111\32\80\82\79\76\79\71\"
и
S = "Turbo PROLOG".
Длина строки измеряется полным числом символов в строке. Турбо-Пролог имеет встроенный предикат str_len, который используется для нахождения длины строки.
srt_len(String_value, String_length).
Если переменная L не обозначена до начала обработки правила srt_len("TODAY",L), то она получит значение длины строки TODAY (сегодня). Этим значением будет целое число.
Конкатенация строк
Конкатенация двух строк означает их объединение, то есть образование одной новой строки. Например, результат конкатенации двух строк
"one day"
"at a time"
может быть либо "one day at a time" или "at a time one day".
Эти две результирующие строки различны, так как образующие их строки были объединены в различном порядке. Турбо-Пролог имеет встроенный предикат concat, который выполняет соединение (конкатенацию) двух строк. Его синтаксис следующий:
concat(Input_string1, Input_string2, Output_String).
Объекты Input_string1 и Input_string2 являются двумя входными строками. Объект Output_string есть объединенная выходная строка. Например:
concat("TODAY", "TOMORROW", S).
означает переменную S строкой "TODAYTOMORROW".
Преобразование данных
Турбо-Пролог для преобразования данных из одного типа в другой имеет следующие предикаты:
upper_lower
str_char
str_int
str_real
char_int.
Их применение целесообразно в случае, когда тип объектов встроенного предиката отличается от типа объектов предиката, определенного пользователем.
Например, предикат writef может вызвать разрушение системы, если ему будет передан объект типа char. Если символьная переменная Drive_ltr_str означена символом 'a', то предикат
writef("The current drive is %:", Drive_ltr_str)
вызовет отказ системы. (Во время компиляции сообщения об ошибках и предупреждения не выдаются). Данная проблема легко может быть преодолена с помощью предикатов, указанных выше.
Например:
str_char(Drive_ltr_srt, Drive_ltr),
writef("The current drive is %:", Drive_letter).
Преобразования столь же необходимы, когда значение одного типа должно быть присвоено переменной другого типа. Все предикаты преобразования данных содержат два объекта. Имена предикатов показывают тип выполняемого преобразования. Например, str_char преобразует строку, состоящую из одного символа и имеющую тип string, в значение типа char. Имена предикатов также указывают и порядок объектов. Например, объект типа string является первым объектом в str_char, а объект типа char - вторым. Эти предикаты имеют два направления преобразования данных. Например, если переменная S1 уже означена и имеет значение STARS AND STRIPES, то предикат upper_low(S1,S2) присваивает строку stars and stripes переменной S2. Но, если S2 обозначена, а S1 не означена, то значение STARS AND STRIPES получает переменная S1. В случае же, когда оба переменные означены, предикат успешен, если одна из переменных имеет значение строки, содержащееся в другой переменной, но записанной строчными буквами. Предикат str_char используется для преобразования объектов типа string в объекты типа char. Предикат str_int используется для преобразования строчного представления целых чисел в переменные типа integer. Предикат str_real используется для преобразования действительных чисел в строки. Предикат char_int используется для присваивания числа (кода ASCII символа) данному объекту.