Приложение а. Использование Пролог-системы
Реализации Пролог-систем отличаются как средствами взаимодействия пользователя с системой, так и средствами поддержки разработки программ. Здесь будет в общих чертах описано, какие средства предоставляет пользователю некоторая стандартная Пролог-система.
Пролог-система обычно реализуется на основе системы файлов. Это означает, что исходная программа размещается в одном или нескольких файлах. Стандартный цикл разработки программы можно представить следующим образом:
Пока не завершена разработка программы, выполнить
С использованием текстового редактора ввести программу (часть программы)
и поместить ее в файл;
Войти в Пролог-систему и загрузить файл с программой;
Выполнить программу (выполнение программы осуществляется обычно с помощью отладчика, имеющегося в Пролог - системе).
Для загрузки набора процедур, находящихся в некотором файле, в 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.
Специальные предикаты: