
- •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. МОДУЛЬНОЕ ПРОГРАММИРОВАНИЕ
- •БИБЛИОГРАФИЧЕСКИЙ СПИСОК
- •ОСНОВНЫЕ КОНСТРУКЦИИ ЯЗЫКА ПРОЛОГ
Тогда после совмещения с первым предложением и неудачи (fail) будет запрещено совмещение со вторым вариантом аксиомы, что спасает от зацикливания.
Использование отсечения и стандартного предиката fail, всегда заканчивающегося неудачей, позволяет реализовать сложные цик лы, например :
until :– cycle. until.
cycle :– repeat, <тело цикла> ,<условие>,!,fail. repeat.
repeat :– repeat.
После вызова предиката until будет вызвано предложение cycle , обеспечивающее повторение последовательности предика тов <тело цикла> до тех пор, пока не станет истинным <условие>. В этом случае вызов предиката отсечения и возврат по неудаче при ведут к неудачному доказательству предиката cycle и возврату к другой альтернативе предиката until .
5. ВСТРОЕННЫЕ ПРЕДИКАТЫ И ФУНКЦИИ
Для создания функционально полной среды программирования в Прологе имеется широкий набор предопределенных предикатов. Их использование позволяет писать программы, по возможностям не уступающие программам на других языках программирования. При описании аргументов предикатов используются следующие со глашения. Префикс «+» обозначает входной параметр, префикс «–»
– выходной, префикс «?» – входной или выходной. Конструкция «ор/ 3» обозначает оператор «ор» с тремя аргументами (арность).
5.1.Арифметические вычисления
Всистеме Turbo-Prolog арифметические выражения оценивают ся при выполнении совмещений. Результатом выполнения предика та X = 2+3 будет значение переменной X, равное 5. В SWI-Prolog для оценивания арифметических выражений используется предикат "is". Эквивалентом приведенного выше примера будет X is 2+3. Кро ме операций, указанных в табл. 2, имеются следующие предикаты и
функции, для которых указаны параметры, их тип, назначение и ре зультат:
∙between(+Low, +High, ?Value) – проверка на значение вну три интервала;
∙succ(?Int1, ?Int2) – Int2 = Int1 + 1;
∙plus(?Int1, ?Int2, ?Int3) – Int3 = Int1 + Int2;
∙random(+Int) – псевдослучайное число в диапазоне от 0 до Int;
∙abs(+Expr) – абсолютное значение;
∙sign(+Expr) – знак числа (–1 для <0; +1 для >0; 0 для нуля);
∙max(+Expr1, +Expr2) – максимальное значение;
∙min(+Expr1, +Expr2) – минимальное значение;
∙round(+Expr) – округление до ближайшего целого;
∙float(+Expr) – преобразование в вещественное;
∙truncate(+Expr) – отбрасывание дробной части;
∙cos(+Expr) – косинус;
∙sin(+Expr) – синус;
∙tan(+Expr) – тангенс;
∙acos(+Expr) – арккосинус;
∙asin(+Expr) – арксинус;
∙atan (+Expr) – арктангенс;
∙exp(+Expr) – экспонента по основанию "e";
∙log(+Expr) – натуральный логарифм;
∙log10(+Expr) – десятичный логарифм;
∙sqrt(+Expr) – квадратный корень;
∙pi – число 3.141593;
∙e – число 2.718282.
Пример: t(X,Y) :– Y is log(exp(sqrt(X*X)))).
5.2. Ввод и вывод
Для обмена информацией с пользователями, для работы с файлами и внешними устройствами в язык введены стандартные предикаты, обслуживающие ввод и вывод информации. По умолча нию ввод и вывод производится на терминал. Реализация средств ввода/вывода в Turbo-Prolog и SWI-Prolog несколько отличается. Общими для них являются следующие предикаты:
∙write(+Arg) – вывод в текущий файл. Аргументами могут быть константы и переменные любого типа. Для вывода информации используется поле минимально необходимой ширины без какихлибо разделителей. Например,
List = [1, 2, 3] , X = 123 , write(["Список = ", List, "; X = " ,X]) выдаст текст: [Список = [1, 2, 3]; X = 123];
∙nl – переводит строку в текущем выходном файле;
∙read(–Term) – чтение следующего терма из текущего файла (до символа «точка» и «возврат каретки»).
ВTurbo-Prolog дополнительно имеются следующие предикаты: ∙ writef(Format, Arg) – форматный вывод. Формат задается
строкой "%–m.pt", где "%" – признак начала форматной стро ки; "–" – признак выравнивания по левому краю поля, при от сутствии – выравнивание по правому краю; m – минимальная ширина поля для числа; p – число цифр дробной части; t – тип: f – с фиксированной точкой, e – экспоненциальный, g –
укороченный формат. Пример: writef("%10.2f",X);
∙readln(–Line ) – чтение строки или имени из текущего файла до ближайшего символа «возврат каретки»;
∙readint (–Int) – чтение целого до возврата каретки. Чтение успешно, если не обнаружено ошибок, иначе – неудачно;
∙readreal(–Real) – чтение вещественного числа из файла. Це лые при чтении автоматически преобразуются в веществен ные. Чтение удачно, если нет синтаксических ошибок;
∙file_str(+FileName, –Str) – чтение всей информации из файла (длина не более 64 Кбайт), например, file_str("\user\t.dat", My_text);
∙readchar (–Charvar) – чтение символа из текущего файла;
∙inkey(–Chаrvar) – проверка нажатия символа на клавиатуре дисплея. Если клавиша нажата, то переменная принимает значение ее кода, иначе – неудача;
∙openread(–ProfileName, +DOSfileName) – связывает для чтения файл в программе и физический файл в стандарте MS DOS. Если файл не найден, то неудача;
∙openwrite(–ProfileName, +DOSfileName) – связывает для за писи файл в программе и физический файл в стандарте MS DOS. Создается новый файл, старый уничтожается;
∙openappend(–ProfileName, +DOSfileName) – связывает для дозаписи в продолжение файл в программе и физический файл в стандарте MS DOS. Если файл не найден, то неуда ча;
∙openmodify(–ProfileName, +DOSfileName) – связывает для чтения и записи файл в программе и физический файл в стандарте MS DOS (см. filepos). Если файл не найден, то неудача;
∙closefile(+ProfileName) – закрытие файла. Всегда удачен;
∙readdevice(?ProfileName) – установка/запрос текущего файла на чтение;
∙writedevice(?ProfileName) – установка/запрос текущего файла на запись;
∙filepos(+ProfileName, ?FilePos, +Mode) – установка/запрос номера текущего символа файла. Если Mode = 0, то позиция относительно начала файла, если Mode = 1, то позиция от носительно текущей, если Mode = 3, то позиция относитель но конца файла. Завершение неудачно, если позиция недо ступна;
∙eof(+ProFileName) – проверка успешности достижения конца файла;
∙flush(+ProFileName) – сброс буфера файла в последова тельный порт (для дисковых файлов это делается автомати чески);
∙existfile(+DOSFileName) – проверка наличия файла на диске;
∙deletefile(+DOSFileName) – удаление файла из оглавления на диске;