Скачиваний:
34
Добавлен:
01.05.2014
Размер:
109.06 Кб
Скачать

Приложение а. Использование Пролог-системы

Реализации Пролог-систем отличаются как средствами взаимодействия пользо­вателя с системой, так и средствами поддержки разработки программ. Здесь будет в общих чертах описано, какие средства предоставляет пользователю некоторая стандартная Пролог-система.

Пролог-система обычно реализуется на основе системы файлов. Это означает, что исходная программа размещается в одном или нескольких файлах. Стандарт­ный цикл разработки программы можно представить следующим образом:

Пока не завершена разработка программы, выполнить

С использованием текстового редактора ввести программу (часть программы)

и поместить ее в файл;

Войти в Пролог-систему и загрузить файл с программой;

Выполнить программу (выполнение программы осуществляется обычно с помощью отладчика, имеющегося в Пролог - системе).

Для загрузки набора процедур, находящихся в некотором файле, в Edinburgh-Прологе предусмотрен стандартный системный предикат consult. Обычно в операционных системах, допускающих приостановку процессов. Пролог-система и текстовый редактор работают параллельно. В этом случае необходимо загружать только тот файл, в котором производились изменения. В других случаях необхо­димо каждый раз загружать всю программу заново.

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

В некоторых Пролог-системах, например в Quintus-Пролог, взаимодействие системы с текстовым редактором реализуется еще более эффективно.

Что касается отладки, то тут каждая Пролог-система имеет свои особенности. Однако наиболее современные отладчики основаны на модели Байда (Warren, 1981). В этой модели можно выполнять анализ цели при ее вызове, успешном решении и попытке повторного решения. Отладчик, обладающий такими возможностями, представлен в гл. 19. Отметим также, что он реализован в Wisdom-Прологе.

В. Системные предикаты

В этом разделе описаны все вычисляемое системные предикаты, реализованные в Wisdom-Прологе. Будучи системными, они не могут переопределяться пользователем. Любая попытка добавить предложение в системный предикат или исключить предложение из системного предиката завершается отказом, сопровождаемым выдачей сообщения об ошибке. Соответствующий системный предикат остается при этом неизменным. Вычислимые системные предикаты предназначены для выполнения следующих задач:

Ввод/вывод:

Считывание программ

Открытие и закрытие файлов

Считывание и запись термов Пролога

Ввод и вывод символов

Арифметика

Воздействие на ход выполнения программы

Классификация и действия над термами Пролога

(металогические средства)

Сравнение термов

Средства отладки

Средства операционной среды

Обозначение Смысл

Типы:

atom (Atom) Atom является атомом-

integer(I) I-целое число.

atomic(A) А атом или целое число.

constant(X) Совпадает с определением предиката atomic.

functor(St,F,A) F является главным функтором St арности А.

arg(N,S,Sn) Sn является N-м аргументом S.

var(V) V - переменная.

nonvar(C) С не является переменной.

Предикаты преобразования программы:

assert (Clause) Включение предложения Clause в конец программы.

asserta (Clause) Включение предложения Clause в начало программы.

assertz (Clause) Совпадает с определением предиката assert.

retract(Clause) Извлечение некоторого предложения, унифицируемого с

предложением Clause.

abolish (F,A) Извлечение (стирание) всех предложений с функтором

F арности А.

consult(FiIe) Обеспечивает ввод программы, содержащейся в файле File. Если вводится некоторая директива, то она исполняется. Если вводится предложение, то оно помещается после любого предложения, уже введенного в соответствующей процедуре.

reconsult(Fite) Имеет тот же смысл, что и предикат consult, однако старые предложения процедур, определенных в файле, удаляются из программы.

clause(G,B) В является телом предложения, заголовок которого унифилируется с G.

listing Распечатка текущей программы.

listing(Name) Распечатка содержащихся в программе предикатов с именем Name.

Предикаты ввода-вывода:

read(T) Т является следующим термом, отделенным в текущем входном файле специальным ограничителем (либо точкой ".", за которой следует возврат каретки (CR), либо пробелом). Предикат не выполняется, если следующий элемент в текущем выходном потоке не унифицируется с термом Т или если пропущен признак конца файла (EOF).

sread(T, Vs) Считывается терм Т и Vs, Vs является списком пар: имя

переменной и сама переменная (значение переменной).

write(T) Запись терма Т в текущий выходной файл.

writeq(T) Запись терма Т, если необходимо, с кавычками.

display (Т) Вывод терма Т на экран дисплея.

displayq(T) Вывод терма Т на экран дисплея, если необходимо, с кавычками.

displayl(L) Вывод на экран дисплея списка объектов.

print (Т) Имеется возможность улучшения качества печати с помощью собственного предиката portray (Т).

see(File) Файл File является новым текущим входным файлом.

seeing(File) Файл File унифицируется с именем текущего входного файла

seen Закрыть текущий входной поток.

tell(File) Определение файла File в качестве текущего выходного

потока (файла).

telling(File) Файл File унифицируется с именем текущего выходного файла.

Told Закрыть текущий выходной поток.

Flush Выдача текущего выходного файла (система использует

буфер ввода/вывода).

get(C) Чтение печатаемого (выводимого) символа из текущего

входного файла.

get0(C) Чтение символа из текущего входного файла.

put(C) Вывод символа С в текущий выходной файл.

tab(N) Печать N пробелов в текущем выходном файле.

n1 Запись символа новой строки в текущий выходной файл.

skip(C) Пропуск в текущем выходном файле всех символов вплоть до символа С.

ttyget(C) Чтение символа С с терминала.

ttyput(C) Возврат символа С, представленного в коде ASCII, на терминал.

ttynl Возврат символа новой строки на терминал.

ttyskip(C) Пропуск всех символов, поступающих с терминала, вплоть до символа С.

ttytab(N) Печать N пробелов на терминале.

ор(Р,Туре,Ор) Определение оператора Ор с приоритетом Р и типом Type. В качестве Ор может использоваться и список имен.

save(File) Сохранение текущего состояния системы в файле File.

log Вывести оглавление базы данных в файл "log".

Средства отладки программ:

trace Назначить цель для трассировки.

trace(G) Выполнить трассировку для цели G.

Универсальные предикаты:

true Всегда имеет значение «истинно».

fait Всегда имеет значение «ложь».

! Отсечение,

exit Завершить работу с Пролог-системой.

abort Прекратить выполнение программы.

call(G) Вызов G.

not(G) Если G выполняется, то not(G) не выполняется.

name (A, L) L список символов в А.

Repeat Повторить произвольное число раз.

, Конъюнкция.

; Дизъюнкция.

=.. Предикат univ.

Х = Y Х унифицируемо с Y.

\ = Отрицание =.

Т1 = = Т2 Т1 равно Т2.

Т1 \= = Т2 Отрицание = = .

system(Comm) Выполнение команды Comm операционной системы.

systemp(F,A) F-функтор, А-арность системного предиката.

save_term(T) Помещение в стек.

unsave term (Т) Считывание из стека.

member(X, Xs) Х-элемент списка Xs.

append (Xs,Ys,Zs) Zs-результат присоединения Ys к Xs.

Специальные предикаты:

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