Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2013_1 / ОТС / promet.pdf
Скачиваний:
98
Добавлен:
23.02.2015
Размер:
683.47 Кб
Скачать

Тогда после совмещения с первым предложением и неудачи (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) – удаление файла из оглавления на диске;

Соседние файлы в папке ОТС