- •Введение
- •1. История Пролога
- •2. Синтаксис и семантика Пролог-программ
- •2.1. Объекты данных1
- •2.2. Декларативный смысл Пролог-программ
- •2.3. Основные определения
- •3. Практическое программирование на Прологе
- •3.1. Структура Пролог-программы
- •3.2. Некоторые предопределенные термы
- •3.3. Свободные и связанные переменные
- •3.4. Внутренняя бд Пролога
- •3.5. Обработка условий и организация циклов в Prolog’е
- •3.5.1. Обработка условия
- •3.5.2. Использование предиката типа repeat
- •3.6. Списки в Прологе
- •3.6.1. Примеры списков
- •3.6.2. Разделение списков на голову и хвост
- •3.6.3. Некоторые полезные программы для работы со списками
- •1. Слияние списков.
- •2. Сортировка списков
- •3.7. Ввод и вывод
- •3.7.1. Файловая система
- •Операции с именами файлов
- •Чтение и запись
- •3.8. Строки и функции работы со строками
- •4. Простенькая экспертная система
- •Игрушечная эс «Кто чем увлекается?»
- •5. Базовые понятия и термины Пролога
- •5.1. Объекты
- •5.2. Внутренние дела Пролога
- •5.3. Что такое шаблоны?
- •5.4. Управление поиском
- •Литература
2. Сортировка списков
goal
sortL([5,4,7,6,11,9],LS)
clauses
sortL([],[]).
sortL([X|T],Sorted_list):-
sortL(T,Sorted_tail),
insert(X,Sorted_tail,Sorted_list).
insert(X,[Y|Sorted_list],[Y|Sorted_list1]):-
ask_order(X,Y),!,
insert(X,Sorted_list,Sorted_list1).
insert(X,Sorted_list,[X|Sorted_list]).
ask_order(X,Y):-X>Y.
3.7. Ввод и вывод
PDC Visual prolog обладает гибкой системой ввода-вывода и манипулирования файлами.
3.7.1. Файловая система
Доступ к файлу может осуществляться в двух «модах» - бинарной и текстовой. Для определения вида доступа используется специальный предикат filemode(SymbolicFileName,Mode).
Параметр Mode принимает одно из двух значений: 0 - Binary Mode, 1 - Text Mode. Дальнейшее изложение имеет отношение только к работе с файлами в текстовой «моде».
Для того, чтобы работать с файлом на внешнем носителе, его нужно открыть или создать. Открыть файл можно для чтения, записи, модификации. Прежде чем это сделать, в файле <имя_проекта>.inc в разделе global domains следует задать символические имена файлов, разделяя их точкой с запятой. (В том месте, где написано %To be edited.). Например, уже написано:
global domains
DB_SELECTOR = browselist_db % For treebrowser tool
FILE = fileselector1; fileselector2 % To be edited
Вы должны добавить Ваши имена:
global domains
DB_SELECTOR = browselist_db % For treebrowser tool
FILE = fileselector1; fileselector2; filein; filein2; fileout % To be edited
Открыть можно практически неограниченное количество файлов, столько, сколько позволяют установки операционной системы (но стоит ли это делать?).
Для перехода от одного открытого файла к другому (перенаправление потоков ввода-вывода) служат предикаты readdevice и writedevice.
Например:
....................
openread(filein,"text.txt")"
openread(filein2,"text2.txt")"
openwrite(fileout,"forwrite.txt")
readdevice(filein),
readln(Str1),
write(Str1)
....................
readdevice(filein2),
readln(Str),
write(Str),
.................
closefile(filein),
closefile(filein2),
closefile(fileout),
.................
Следует помнить, что при открытии файла предикатом openwrite(SimbolicFileName,OSFileName) существующий файл очищается, несуществующий - создается. Для дозаписи существующий файл открывается предикатом
openappend(SimbolicFileName,OSFileName)
Открыть файл для чтения и записи можно предикатом
openmodify(SimbolicFileName,OSFileName).
Кода вы работаете с файлом в режиме чтения - записи, следует после каждой записи использовать предикат
flush(SimbolicFileName),
который вызывает принудительную очистку буфера. Он полезен также во время отладки программы, когда вы пишите некоторую информацию для трассировки. (Flush существенно замедляет выполнение программы.)
Для реализации нелинейного («гипертекстового») доступа к файлу используется предикат
filepos(SymbolicFileName,FilePosition,Mode),
перемещающий (шаблон (i,i,i)) и берущий (i,o,i) текущую позицию в файле.
Параметр Mode определяет «точку отсчета» позиции:
0 - от начала файла
1 - относительно текущей позиции
2 - относительно конца файла
Предикат eof(SymbolicFileName) предназначен для контроля конца файла.
domains
nondeterm repeat
читать_и_обработать_строки
обработать_строку(symbol)
....................
clauses
repeat.
repeat:-repeat.
читать_и_обработать_строки:-
repeat,
readln(f,S),
обработать_строку(S),
eof(f),!,closefile(f);!.
......................
Файлы можно копировать, переименовывать, удалять, искать.
copyfile(FromName, ToName)
renamefile(OldOSFileName, NewOSFileName)
deletefile(OSFileName)
searchfile(SearchPath, FileName, FoundName)
existfile(OSFileName)
