Шаг 55.
Основы логического программирования.
Чтение

    На этом шаге мы рассмотрим чтение.

    Пролог включает в себя несколько стандартных предикатов для чтения. Из них четыре основных:

    И дополнительно - 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 терпит неудачу.

Предикат readterm/2

    Предикат readterm считывает сложные термы. Он имеет следующий формат:

   readterm(DomainName,Term) % (i,i)

    Вы вызываете readterm с двумя аргументами: именем домена и термом, readterm читает строку и превращает ее в терм указанного домена. Если строка не имеет вид объекта, сформированного предикатом write, то readterm дает ошибку. Стандартный предикат readtermerror может быть использован для получения информации об ошибках, произошедших в readterm.

    Предикат readterm может использоваться для обработки термов в текстовых файлах Например, вы можете создать собственную версию consult.

Предикат file_str/2

    Предикат file_str читает символы из файла в строку, или создает файл и записывает в этот файл строку. Он использует формат:

   file_str(Filename,Text) % (i,o),(i,i)

    Если перед вызовом file_str переменная Text свободна, file_str читает символы из файла Filename, пока не встретит символ конца файла (обычно это комбинации клавиш Ctrl+Z). Содержимое файла Filename пересылается в переменную Text. Например, вызов:

   file_str ("T.DAT",My_text)

свяжет Mytext с содержимым файла T.DAT. При этом строка может содержать символы возврата каретки.

    Если My_text связана с текстом из T.DAT, то file_str("Т.ВАК", Mytext) создаст файл с именем Т.ВАК, который содержит текст из T.DAT. Если Т.ВАК уже существует, он будет перезаписан.

    Рассмотрим несколько примеров использования стандартных предикатов чтения, демонстрирующих, как можно использовать стандартные предикаты чтения для работы со сложными структурами данных и вводимыми списками.

  1. Следующая программа показывает, как извлекать сложные структуры данных из входных строк.
       domains
          person=p(name,age,telno,job)
          age=integer
          telno,name,job=string
       predicates
          readperson(person) 
          run
       clauses
          readperson(p(Name,Age,Telno,Job)):-
             write("Which name?"),
             readln(Name),
             write("Job?"),
             readln(Job),
             write("Age?"),
             readint(Age),
             write("Telephone no?"),
             readln(Telno).
          run:-
             readperson(P),nl,
             write(P),nl,nl,
             write("Is this compound object OK(y/n)"),
             readchar(Ch),Ch='у',
             !.
          run:-
             nl,
             write("Alright,try again"),
             nl,nl,
             run.
       goal 
          run.
    
        Текст этой программы можно взять здесь.

        Результат работы программы можно посмотреть на рис.1


    Рис.1. Результат работы программы pro55_1.pro

  2. В данном примере показано использование предиката readint для чтения целых чисел и преобразования их в список. Он читает одно целое число на строке, пока вы не введете не целое (например, клавишу Х). После этого readint потерпит неудачу, и Пролог выведет список на экран.
       domains
          list=integer*
       predicates
          readlist(list)
       clauses
          readlist([H|T]):-
             write("> "),
             readint(H),!,
             readlist(T).
          readlist([ ]).
       goal
          write("*************** Integer List *****************"),nl,
          write("Type in a column of integers, like this:"),nl,
          write("integer (press ENTER)\n integer (press ENTER)\n"),
          write(" etc.\n\n Type X (and press ENTER) to end the list.\n\n"),
          readlist(TheList),nl,
          write("The list is: ",TheList).
    
        Текст этой программы можно взять здесь.

        Загрузите программу и запустите ее. После подсказки введите столбец целых чисел (например, 1234, 567, 89, 0), затем нажмите комбинацию клавиш X+Enter для окончания ввода.

    Со следующего шага мы начнем рассматривать файловую систему.




Предыдущий шаг Содержание Следующий шаг