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

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


examination:flp:question54

Содержание

file_str

Предикат 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. Если Т.ВАК уже существует, он будет перезаписан.

filemode

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

 filemode(SymbolicFileName,FileMode) % (i,i)

Если FileMode=0, файл SymbolicFileName устанавливается в двоичный режим; если FileMode=1, то он устанавливается в текстовый режим.

В текстовом режиме при записи к новым строкам добавляются символы «возврат каретки»\«перевод строки», а при чтении эта пара символов интерпретируется как новая строка.

    Carriage return (возврат каретки) = ASCII 13
   Line feed (перевод строки) = ASCII 10 

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

filepos

Предикат filepos может управлять позицией, где производится чтение или запись. Он имеет формат:

 filepos(SymbolicFileName,FilePosition,Mode) % (i,i,i),(i,o,i)

Если FilePosition - связанная переменная, предикат может изменить позицию чтения и записи для файла с именем SymbolicFileName. Если при вызове FilePosition является свободной переменной, то SymbolicFileName возвращает текущую позицию в файле.

Mode является целой величиной и указывает, как должно интерпретироваться (согласно таблице 1) значение FilePosition.

Таблица 1.

Интерпретация значения FilePosition

Mode \ FilePosition

0 - Относительно начала файла

1 - Относительно текущей позиции

2 - Относительно конца файла (конец файла соответствует позиции 0)

Когда возвращается FilePosition, то filepos возвращает позицию относительно начала файла независимо от значения Mode.

fail

Пролог начинает поиск с возвратом, когда вызов завершается неудачно. В определенных ситуациях бывает необходимо инициализировать выполнение поиска с возвратом, чтобы найти другие решения. Пролог поддерживает специальный предикат fail, вызывающий неуспешное завершение, и, следовательно, инициализирует возврат. Действие предиката fail равносильно эффекту от сравнения 2 = 3 или другой невозможной подцели. Программа pro30_1.pro иллюстрирует использование этого специального предиката.

 domains
    name=symbol
 predicates
    father(name, name)
    everybody
 clauses
    father(leonard,katherine). 
    father(carl,jason). 
    father(carl,marilyn).
    everybody:-
       father(X,Y),
       write(X," is ",Y,"'s father\n"), 
       fail.

Текст этой программы можно взять здесь.

Пусть необходимо найти все решения цели father (X,Y). Цель можно записать как

 father (X,Y).

Пролог найдет все решения цели father (X,Y) и отобразит значения всех переменных следующим образом:

 X=leonard,Y=katherine
 X=carl,Y=jason
 X=carl,Y=marilyn

Нo если вы скомпилируете эту программу и запустите ее (командой меню Run), то Пролог найдет только первое подходящее решение для father (X,Y). После того как целевое утверждение, определенное в разделе goal, выполнено впервые, ничто не говорит Прологу о необходимости продолжения поиска с возвратом. Поэтому обращение к father приведет только к одному решению. Как же найти все возможные решения? Предикат everybody в программе использует fail для поддержки поиска с возвратом.

Задачa предиката everybody - найти все решения для father и выдать полный ответ. Сравните предыдущие ответы Пролога с целью father (X,Y) и ответы на выполнение следующей цели:

 everybody.

отображенные приведенной программой:

    leonard is katherine's father
   carl is jason's father
   carl is marilyn's father 

Предикат everybody использует поиск с возвратом с тем, чтобы получить все решения для father (X,Y), заставляя Пролог выполнять поиск с возвратом сквозь тело правила everybody:

 father(X,Y),
 write(X, " is ",Y, "'s father\n"),
 fail.

fail не может быть согласован (он всегда неуспешен), поэтому Пролог вынужден повторять поиск с возвратом. При поиске с возвратом он возвращается к последнему обращению, которое может произвести множественные решения. Такое обращение называют недетерминированным. Недетерминированное обращение является противоположностью детерминированному обращению, которое может произвести только одно решение.

Предикат write не может быть вновь согласован (он не может предложить новых решений), поэтому Пролог должен выполнить откат дальше, на этот раз к первой подцели в правиле.

Обратите внимание, что помещать подцель после fail в теле правила бесполезно. Предикат fail все время завершается неудачно, нет возможности для достижения подцели, расположенной после fail.

field_attr

Flow patterns (i, i, i, i), (i, i, i, o)

Set or get the attributes for a field Remarks

(i, i, i, i) If Row and Column refer to a position within the current window, and a field of the given Length starting at that position can be contained inside that window, field_attr succeeds by giving the attribute Attr to all the positions in that field.

(i, i, i, o) field_attr binds Attr to the attribute of the first character in the specified field. The field occupies Length character cells, starting at position (Row, Column) of the current window. As with (i, i, i, i), the specified field must fit inside the window.

free

Проверяет, является ли переменная пустой

examination/flp/question54.txt · Последние изменения: 2014/01/15 12:17 (внешнее изменение)