- •1. ИСПОЛЬЗОВАНИЕ ЯЗЫКА ПРОЛОГ
- •2. ЛОГИЧЕСКИЕ ОСНОВЫ ЯЗЫКА ПРОЛОГ
- •2.1. Представление знаний и фактов
- •2.2. Исчисления логического типа
- •2.3. Исчисление резольвент
- •3. МЕХАНИЗМ РАБОТЫ ИНТЕРПРЕТАТОРА ПРОЛОГ-МАШИНЫ
- •Трассировка доказательства теоремы
- •4. ЯЗЫК ПРОЛОГ
- •4.1. Объявления
- •4.2. Данные и константы
- •Типы данных в Прологе
- •4.3. Управление возвратом
- •5. ВСТРОЕННЫЕ ПРЕДИКАТЫ И ФУНКЦИИ
- •5.1. Арифметические вычисления
- •5.2. Ввод и вывод
- •5.3. Текстовые окна и управление экраном
- •5.4. Обработка строк и преобразование типов
- •5.5. Базы данных
- •5.6. Вспомогательные средства
- •6. МОДУЛЬНОЕ ПРОГРАММИРОВАНИЕ
- •БИБЛИОГРАФИЧЕСКИЙ СПИСОК
- •ОСНОВНЫЕ КОНСТРУКЦИИ ЯЗЫКА ПРОЛОГ
∙renamefile(+OldDOSFileName, +NewDOSFileName) – пере именование файла;
∙disk(?DOSPath) – установка/запрос текущего пути доступа. В языке SWI-Prolog имеются следующие средства:
∙see(+ScrDest) – установить текущий входной поток из файла;
∙tell(+ScrDest) – установить текущий выходной поток в новый файл;
∙append(+ScrDest) – установить текущий выходной поток в старый файл;
∙seeing(?ScrDest) – запрос имени текущего входного файла;
∙telling(?ScrDest) – запрос имени текущего выходного файла;
∙seen – закрыть входной файл;
∙told – закрыть выходной файл.
Кроме приведенных выше, имеются достаточно разнообразные средства управления вводом/выводом, с составом которых можно познакомиться в файле оперативной помощи.
5.3. Текстовые окна и управление экраном
Для более эффективного использования площади экрана дис плея в программах языке на Turbo-Prolog можно создавать тексто вые окна, куда направляется выдача сообщений и откуда считыва ются данные, вводимые с клавиатуры. Этому служат следующие предикаты:
∙makewindow (+WNo, +ScrAttr, +FrameAttr, +Heder, +Row, +Column, +Height, +Width) – создание окна с номером WNo, с атрибутами экрана ScrAttr и рамки FrameAttr , с заголовкомстрокой Header , с координатами левого верхнего угла Row и Column и размерами по высоте Height и ширине Width . Но мер окна может быть произвольным числом и служит для ссылки на него в других предикатах. ScrAttr из [0,255]; FrameAttr из [0,7]; Row, Height из [1,25]; Column, Width из [1,80];
∙shiftwindow(?WNo) – установка/запрос номера текущего окна;
∙clearwindow – очистка текущего окна;
∙removewindow – удалить текущее окно;
∙window_attr(+Attr) – установка атрибутов текущего окна;
∙window_str(?ScrStr) – вывод/чтение содержимого окна в строковую переменную;
∙scr_char(+Row, +Column, ?Char) – вывод/чтение символа окна;
∙scr_attr(+Row, +Column, ?Attr) – установка/запрос атрибутов знакоместа;
∙field_str(+Row, +Column, +Length, ?String) – вывод/чтение поля заданной длины;
∙field_attr(+Row, +Column, +Length, ?Attr) – вывод/чтение атрибутов поля заданной длины;
∙cursorform(+StartLine, +EndLine) – установка зоны для кур сора внутри знакоместа. StartLine, EndLine из диапазона [1,14];
∙attribute(?Attr) – установка/запрос атрибутов всего экрана.
5.4. Обработка строк и преобразование типов
Для манипулирования со строками символов язык Turbo-Prolog включает ряд предикатов:
∙frontchar(+String1, ?Char, ?String2) – отделение символа Char от строки String1, остаток помещается в String2;
∙fronttoken(+String, ?Token, ?Rest) – отделение слова Token от строки String, остаток помещается в Rest;
∙frontstr(+Length, +InpString, –StartString, –RestString) –
отделение подстроки StartString длиной Ltngth от строки InpString, остаток помещается в RestString;
∙concat (?Str1, ?Str2, ?Str3) – сцепление строк Str1, Str2 с по мещением результата в Str3;
∙str_len(+String, ?Length) – вычисление длины строки;
∙isname(+String) – проверка синтаксиса имени.
Следующие предикаты позволяют преобразовывать данные различных типов:
∙char_int(?Char, ?Int) – преобразование символа в число и наоборот;
∙str_int(?Str, ?Int) – преобразование целого числа в строку;
∙str_char (?Str, ?Char) – преобразование односимвольной строки "X" в символ 'X';
∙str_real(?Str, ?R) – преобразование строки в число;
∙upper_lover(?Str1, ?Str2) – преобразование символов верх него и нижнего регистров;
Для манипулирования со строками символов язык SWI-Prolog включает ряд предикатов:
∙atom_chars(?Atom, ?String) – преобразование атома в стро ку и обратно;
∙number_chars(?Number, ?String) – преобразование числа в строку;
∙concat(?Atom, ?Atom, ?Atom) – сцепление атомов как строк;
∙string_concat(?String, ?String, ?String) – сцепление строк.
5.5. Базы данных
Системы Turbo- и SWI-Prolog перед исполнением программ транслирует их текст во внутреннее представление, что затрудняет модификацию программ во время исполнения. Поэтому в языке предусмотрены базы данных, являющиеся хранилищами множе ства фактов в смысле определений, данных ранее. Для манипули рования динамическими базами фактов имеется ряд стандартных предикатов:
∙asserta(+Term) – добавить в начало базы данных факт, за даваемый термом;
∙assertz(+Term) – добавить в конец базы данных факт, зада ваемый термом;
∙retract(+Term) – удалить из базы данных первое вхождение факта, задаваемого термом;
∙consult(+DOSFileName) – загрузить базу данных из файла;
∙save(+DOSFileName) – сохранить базу данных в файле (только Turbo-Prolog).
Для использования баз данных в SWI-Prolog не требуется до полнительных описаний, а в Turbo-Prolog их состав должен быть описан в декларативной части программы. Базы данных описывают
ся после доменов перед предикатами программы. Описание баз данных начинается служебным словом "database". Состав базы данных определяется аналогично описанию предикатов вида:
<имяпредиката>(<имядомена1>, ... ,<имядоменаn>),
где имена доменов определяют тип соответсвующего параметра предиката, например:
database
person(string, integer, string, string) proffes(string, real)
В приведенном примере первый параметр предиката person строкового типа может определять фамилию и инициалы человека, второй – возраст, третий – должность, четвертый – адрес и теле фон. Например, предикат assertz(person("Петров И.С.", 37, "води тель трамвая", "620000, Свердловск, Кирова, 70. тел. 55–17–00")) добавит в базу данных новый факт.
При работе механизма унификации факты из базы данных про сматриваются в том же порядке, что и предложения программы. Для поиска в базе данных всех фактов, согласующихся с запросом, име ется предикат
findall(+Var, +Atom, –ListVar), где Var определяет имя перемен ной, которая помещается в список ListVar , если найден факт, за данный вторым параметром Atom, например:
findall(Age, person(_, Age, _, _), L).
5.6. Вспомогательные средства
Среди вспомогательных средств языка Пролог имеются:
∙trace/untrace – включить/выключить режим трассировки для всех предикатов;
∙trace(+Pred) – включить режим трассировки для указанного предиката;
∙true – удача;
∙fail – неудача.
Дополнительно в языке Turbo-Prolog к этой категории средств отнесятся:
∙ exit – выход в главное меню системы;
∙edit(+InputString, –OutputString) – редактирование входной строки средствами экранного редактора Системы и помеще ние результата в выходную строку. Завершение редактиро вания производится нажатием клавиши "ESC" или "F10";
∙editstring(+InStr, –OutStr, +LeftHeader, +RightHeader, +Message, +HelpFile, +Pos, –Code) – редактирование вход ной строки средствами экранного редактора системы и по мещение результата в выходную строку. Завершение редак тирования производится нажатием клавиши "ESC" или "F10". Выдаются два заголовка LetfHeader, RightHeader. Курсор устанавливается в позицию Pos во входной строке InStr. Со общение Message выводится в нижней части окна. При нажа тии клавиши "F1" выводится сожержимое файла HelpFile. Code = 0, если выход из редактора призводится нажатием клавиши "F10" и Code = 1, если нажатием "ESC";
∙display(+String) – выдать строку в текущее окно;
∙dir(+Path, +FileSpec, –FileName) – вызов команды выдачи оглавления с выбором имени файла по меню. Например, dir("c:\user","*.pro",File);
∙date(?Year, ?Month, ?Day) – запрос/установка даты;
∙time(?HH, ?MM, ?SS, ?CC) – запрос/установка времени;
∙system(+DOSComand) – выход в DOS для исполнения ко манды.
В системе SWI-Prolog имеются дополнительные предикаты:
∙help(<тема>) – запрос помощи по указанной теме (предикат или функция);
∙apropos(<тема>) – запрос помощи по контексту;
∙load_files(+Files, +Options) – загрузить файлы в базу дан ных;
∙repeat – бесконечный цикл;
∙get_time(–Time) – запрос времени;
∙convert_time(+Time, –Year, –Month, –Day, –Hour, –Minute, –Second, –Msec) – преобразование времени;
∙exist_file(+File) – проверка наличия файла;
∙delete_file(+File) – удалить файл;
∙chdir(+Path) – изменить рабочий каталог;
