Скачиваний:
201
Добавлен:
17.06.2016
Размер:
2.69 Mб
Скачать

Fileerror/2

В Турбо Прологе предикат fileerror применяется, когда возникает

ошибка при работе с файлами. (Такие ошибки могут возникать в Турбо Проло-

ге при записи или чтении файлов в редакторе).

Если вы определите ваш собственный предикат fileerror, то запомните,

что он всегда выполняется успешно и работает только в .EXE программах.

Предикат fileerror должен быть объявлен как

global predicates

fileerror(integer, string) - (i,i) language c

Необходимо отметить, что это объявление является правильным даже

тогда, когда исходный текст написан на Прологе.

Ниже приведен пример введенного пользователем предиката fileerror:

clauses

fileerror(V,FileName):-

makewindow(1,7,23,"Error!",5,5,20,45),

writef("\nError:% accessing file:%",V,File Name),

readchar(-),

removewindow,fail.

fileerror(_,_).

Анализ потока параметров

При обращении к предикату аргументы, значения которых известны, рас-

сматриваются как входные параметры (i), а неизвестные - как выходные па-

раметры (0). Список входных и выходных параметров для данного предиката

называют потоком параметров (flow pattern).

Если, например, предикат имеет два параметра, то существуют четыре

варианта потока параметров:

(i,i) (i,o) (o,i) (o,o)

При компиляции программ в Турбо Прологе выполняется глобальный ана-

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

затем выполняется оценка всей программы, при этом поток параметров прис-

ваивается для каждого из обращений к предикату в программе.

Анализ потока параметров весьма прост; фактически вы его выполняете,

когда пишете свою программу. Рассмотрим некоторые примеры:

goal

cursor(R,C), R1=R+1, cursor(R1,C).

При первом обращении к предикату cursor переменные R и C являются

свободными, это означает, что предикат cursor вызывается с потоком пара-

метров cursor(o,o). Вы знаете, что переменные являются свободными, если

они встречаются впервые. При анализе потока параметров, если переменная

не используется в голове предложения, то при первом обращении к предикату

данная переменная трактуется как выходная.

В выражении R1=R+1, переменная R трактуется как связанная, поскольку

она выходит из предиката cursor. Если бы она была свободной, то появилось

бы сообщение об ошибке. После этого выражения переменная R1 также стано-

вится связанной.

При последнем обращении к предикату cursor, обе переменные R1 и C

уже известны, так что они трактуются как входные параметры; при этом пре-

дикат будет иметь следующий поток параметров cursor(i,i).

При обращении к предикату, введенному пользователем, система будет

присваивать ему поток параметров точно также, как если бы это был стан-

дартный предикат. Для каждого предиката со своим потоком параметров вы-

полняется анализ параметров, начиная от головы предложения.

В качестве иллюстрации рассмотрим следующий фрагмент программы:

predicates

changeattrib(Integer, Integer)

clauses

changeattrib(NewAttrib, OldAttrib):-

attribute(OldAttrib), attribute(NewAttrib).

goal

changeattrib(112,Old), write("Hello"),

attribute(Old), write("there").

В секции goal первое обращение к предикату changeattrib выполняется

с потоком параметров changeattrib(i,o) (поскольку 112 известно, а Old -

нет). Это означает, что в предложении для changeattrib переменная

NewAttrib будет входным параметром, а OldAttrib - выходным параметром.

Поэтому при анализе потока параметров первой подцели

attribute(OldAttrib), предикат attribute будет вызываться с потоком пара-

метров attribute(o), тогда как при втором обращении предикат будет вызы-

ваться с потоком параметров attribute(i). И, наконец, в целевом утвержде-

нии параметр Old для предиката attribute будет входным параметром, пос-

кольку Old является выходным параметром для changeattrib.

Соседние файлы в папке Документация