Информирует систему, что указанный
7.2. Ввод и вывод
Файлы являются последовательными. Существуют текущие входной и выходной потоки. Пользовательский терминал рассматривается как файл с именем user.
Переключение между потоками осуществляется с помощью процедур:
see (Файл) - файл становится текущим входным потоком;
tell (Файл) - файл становится текущим выходным потоком;
seen - закрывается текущий входной поток;
told - закрывается текущий выходной поток.
Файлы читаются и записываются двумя способами:
* как последовательности символов;
* как последовательности термов.
Встроенные процедуры для чтения и записи символов и термов таковы:
read(-Term) - вводит следующий терм;
write(+Term) - выводит Term;
put(+Char) - выводит символ, Char должно быть целочисленное выражение, значение которого есть код ASCII или атом в виде одной литеры;
get0(-КодСимвола) - вводит следующий символ;
get(-КодСимвола) - вводит ближайший следующий “печатаемый” символ.
Пример. Пусть во время работы создана база данных, состоящая из множества фактов вида father(X,Y). Требуется записать все эти факты в файл base.dat.
'записать базу данных':-
tell('base.dat'),
base,
told.
base:-
father(X,Y),
write(father(X,Y)),
write('.'),nl,
fail.
base.
7.3. Работа с базой данных “Достопримечательности”
(программа, которая учится у пользователя)
Предикат place(Место, Авеню, Стрит) связывает название места в городе с номерами улиц (авеню и стрит), на пересечение которых это место расположено. По заданному названию места данная процедура пытается определить его адрес, просматривая базу данных “адрес” (множество фактов вида adress(whitehous,7,1)). Процедура place действует с предположением об открытости мира в том смысле, что она не просто завершается неудачей, если не может найти название места в базе данных.
Вместо этого процедура переключается на другую стратегию и получает сведения от пользователя, выступающего в роли альтернативного источника знаний. Процедура place учится на своем опыте, добавляя новые ответы в текущую программу.
Эта программа работает следующим образом.
?- goal.
adress.dat compiled, 0.00 sec, 268 bytes. % загружается база данных
Введите название достопримечательности
whitehous.
Это место вблизи 7 авеню и 1 стрит.
Продолжать? yes
Введите название достопримечательности
grand_central.
-- это место - grand_central
вблизи какой авеню? (номер) 42.
вблизи какой стрит? (номер) 8.
Это место вблизи 42 авеню и 8 стрит.
Продолжать? yes
Введите название достопримечательности
grand_central.
Это место вблизи 42 авеню и 8 стрит.
Продолжать? no % записывается новая база данных в файл
Yes
Заметьте, что при выполнении второго запроса система спросила у пользователя адрес “grand_central”. Пользователь ввел 42 и 8, а затем интерпретатор вывел эти же самые значения как ответы на запрос. Если дать тот же запрос повторно, то процедура place уже будет знать адрес “grand_central”.
place(X,Avenu,Street) :-
adress(X,Avenu,Street),!.
place(X,Avenu,Street) :-
write('-- это место - '),write(X),nl,
write('вблизи какой авеню? (номер) '),
read(Avenu),
write('вблизи какой стрит? (номер) '),
read(Street),
assert(adress(X,Avenu,Street)).
run(X) :-
place(X,Avenu,Street),
write('Это место вблизи '),write(Avenu),write(' авеню'),nl,
write('и '),write(Street),write(' стрит.').
'ввести базу знаний' :-
consult('adress.dat').
goal:-
write('Спрашивайте:'),nl,
'ввести базу знаний',
repeat,
write('Введите название достопримечательности'),nl,
read(X),
run(X),nl,
'продолжать'.
'продолжать':-
write('Продолжать? '), yes.
yes:-
get_single_char(C),
(name(n,[C]),write('no'),'записать базу данных',!;
write('yes'),nl,fail).
'записать базу данных':-
tell('adress.dat'),
base,
told.
base:-
adress(X,Avenu,Street),
write(adress(X,Avenu,Street)),
write('.'),nl,
fail.
base.