Инструменты пользователя

Инструменты сайта


examination:flp:question64

Readln \ readint \ readchar

Пролог включает в себя несколько стандартных предикатов для чтения. Из них четыре основных: readln - для чтения всей строки символов; readint - для чтения целых значений; readreal - для чтения вещественных значений; readchar - для чтения символьных значений.

И дополнительно - readterm - для чтения любых термов, включая составные объекты.

Все эти предикаты могут быть переориентированы для чтения из файлов.

Другой, более специализированный предикат, относящийся к категории чтения, - это file_str - для чтения всего текстового файла в строку. Предикат readln/1

Предикат readln читает текстовую строку, используя формат:

 readln(Line) % (о)

Домен для переменной Line должен быть строкового типа. Перед тем как вы вызовете readln, переменная Line должна быть свободна, readln считывает до 254 символов (плюс возврат каретки) с клавиатуры и до 64 Кбайт с других устройств. Если во время ввода с клавиатуры нажать клавишу Esc, то readln потерпит неудачу. Предикаты readint/1, readreal/1, readchar/1

Предикат readint считывает целое значение, используя формат:

 readint(X) % (о)

Домен для переменной X должен быть целого типа, а X перед вызовом должна быть одна. Предикат readint будет считывать целое значение с текущего входного устройства (возможно, с клавиатуры), пока не будет нажата клавиша Enter. Если считанная строка не соответствует синтаксису целых, readint терпит неудачу, и Пролог вызывает механизм поиска с возвратом. Если во время ввода с клавиатуры нажать клавишу Esc, то readint также терпит неудачу.

Предикат readreal работает в соответствии со своим названием: он считывает вещественные числа (аналогично тому, как readint считывает целые). Предикат readreal ипользует следующий формат:

 readreal(X) % (о)

Домен для переменной X должен быть вещественного типа, а X должна перед вызовом быть свободна. Предикат readreal будет читать вещественные значения с текущего устройства ввода, пока не будет нажат клавиша Enter. Если ввод не соответствующих обычному синтаксису вещественных чисел, то readreal терпит неудачу. Если во время ввода нажать клавишу Esc, readreal также терпит неудачу.

Предикат readchar считывает один символ с текущего устройства ввода, используя формат:

 readchar(CharParam) % (о)

Перед вызовом предиката readchar переменная CharParam должна быть свободной и принадлежать домену char. Если текущим устройством ввода является клавиатура, readchar ждет, пока будет нажат один символ, после чего возвращает его. Если во время ввода нажать клавишу Esc, то readchar терпит неудачу.

readdevice

Предикат readdevice переопределяет current_read_device (текущее устройство чтения) или возвращает его имя. Предикат имеет формат:

 readdevice(SymbolicFileName) % (i), (о)

Предикат readdevice переопределяет текущее устройство чтения, если переменная SymbolicFileName определена, и файл открыт для чтения. Если SymbolicFileName является свободной переменной, то readdevice присвоит ей имя текущего активного устройства чтения.

random

Для генерации случайных чисел в Прологе предусмотрены два стандартных предиката. Один из них возвращает случайное вещественное число в диапазоне от 0 до 1, другой возвращает случайное целое число в диапазоне от 0 до данного числа. Кроме того, случайная числовая последовательность может быть переинициализирована. Предикат random/1

Эта версия random возвращает случайное вещественное число RandomReal, которое удовлетворяет условию:

  0<=RandomReal<1. 
   random/1 имеет формат: 
 random(RandomReal)  %  (о)

Предикат random/2

Эта версия random имеет два аргумента, его формат:

 random(MaxValue,Randomlnt)  %  (i,о)

Этот предикат ставит в соответствие RandomInt случайное целое, удовлетворяющее условию:

  0<=RandomInt<MaxValue 

Предикат random/2 работает значительно быстрее, чем random/1, т.к. random/2 использует только целочисленную арифметику.

В качестве примера приведем программу, которая использует random/1 для набора трех имен из пяти случайным обpaзом.

 predicates
    person(integer,symbol) 
    rand_int_1_5(integer)
    rand_person(integer)
 clauses
    person(1,fred).
    person(2,tom).
    person(3,mary). 
    person(4,dick).
    person(5,george).
    rand_int_1_5(X):-
       random(Y),
       X=Y*4+1.
    rand_person(0):-!.
    rand_person(Count):-
       rand_int_1_5(N),
       person(N,Name),
       write(Name),nl,
       NewCount=Count-1,
       rand_person(NewCount).
 goal
    rand_person(3).
examination/flp/question64.txt · Последние изменения: 2014/01/15 08:17 (внешнее изменение)