Логическое программирование

       

Информирует систему, что указанный


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.


Содержание раздела