ЯЗык "Пролог". Понятие базы знаний, определение. Задачи и упражнения, страница 13


Формат: (file,string) - (i,i)

Идентификатор- константа, имеющая тип file (описывается в разделе DOMAINS),

ДосИмя - строковая константа (Имя файла ДОС, заключенное в кавычки), (i,i) говорит о том, что переменные в качестве аргументов недопустимы.

Пример: openread(dd,"777.dat").

ореп\л/гКе(Идентификатор,ДосИмя) - открытие файла как выходного потока Формат: (file,string) - (i,i)

Пример: openwrite(d,"77.dat").

геас!с1еу1се(Идентификатор)   -   определить/получить   файл входного потока Формат: (file) - (i) (о)

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

Пример: readdevice(dd), readdevice(D).

у/пЧэйеУ1се(Идентификатор) - определить/получить файл выходного потока Формат: (file) - (i) (о)

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

Пример: writedevice(dd), writedevice(D).

closefile(KqeffTVKtDHKaTop) - закрыть текущий входной/выходной поток


Формат: (file) - (i)

Пример: closefile(dd)

ео^Идентификатор) - этот предикат истинен, если очередной считываемый из текущего входного потока символ- символ конца файла Формат: (file) - (i)

Пример: eof(dd)

5.5. Задачииупражнения

1.  Написать программу, которая считывает из файла натураль ные числа, переводит их из десятичной системы в двоичную и за писывает полученный результат в другой файл.

2.  Разработать программу, которая считывает строки из файла, затем сортирует их в алфавитном порядке изаписывает в другой файл.

РЕШЕНИЕ.

1.Программа может быть такой:

%   -перевод чисел из 10 в 2 с/с:

/*Для работы необходимо создать два файла по правилам */ /*ДОС. При вводе чисел во входной файл после каждого числа*/

/* нажимать <Бвод>             */

/«А************»*****************************************/

domains

file=readfile;writefile 4Hcno=integer список=число* вх_файл,вых_файл=51ппд

predicates

переводЮ_2(вх_файл,вых_файл)

получить(число)


преобразовать(число,список)

записать(список)

конкат(список,список,список)

перевод открыть(вх_файл,вых_файл)

закрыть(вх_файл,вых_файл)

показ(вх_файл,вых_файл)

clauses переводЮ_2(ИмФВх,ИмФВых)>

открыть(ИмФВх,ИмФВых), перевод, закрыть(ИмФВх,ИмФВых), показ(ИмФВх,ИмФВых).

открыть(ИмФВх.ИмФВых):-openreacl(readfile)ИмФBx),readdevice(readfile), openwrite(writefile,Mf^Bbix),writedevice(writefile).

закрыть(ВхФайл,ВыхФайл):closefile(readfile), closefile(writefile).

перевод:-                                     %если не конец файла,

not( eof(readfile)),                      %то получить из вх_файла получить(ЧислоЮ),                 %дес. число, преобразовать(Число10,Число2),     %перевести в двоичное, записать(Число2),                              %записать в вых_файл;

перевод.                                    %иначе выход.

перевод.

получить(ЧислоЮ):-readint(Чиcлo),Чиcлo10=Чиcлo.

преобразовать(0,[0]):-!. преобразовать(Число10,Число2):X1=4ncno10div2,

Х2=Число10 mod 2, преобразовать(Х1 ,Хдв1), конкат(Хдв1 ,[Х2],Число2).

конкат([],1_,1_).


конкат([Х|!_1],1_2,[Х|1_3]):-KOHKaT(L1,L2,L3).

/*     Вывод двочного представления числа   */

/Л*******************************************************/

записать([]):-п1,!. записать([Х|Ц):-\л/п{е(Х),зэписать(1_).

Г------- Конец - Перевод чисел из 10 в 2 с/с------- */

2.Программа может быть такой:

/*               Сортировка строк файла                */

I* Для работы необходимо создать два файла по правилам */ /* ДОС Входной файл (ИмФВх) сортируется по строкам.   */ /* Результат записывается в выходной файл (ИмФВых).    */

domains

CTpoK?,=string

спис_строк=строка*

predicates

сорт_файла(вх_файл,вых_файл)

сорт(спис_строк,спис_строк)

формировать_список(спис_строк)

внести(строка,спис_строк,спис_строк)

сортировка зап(спис_строк)

%псказ(вх_файл,вых_файл)

clauses сорт_файла(ИмФВх,ИмФВых)>

от-крыть(ИмФВх,ИмФВых),сортировка,закрыть(ИмФВх,ИмФВых), показ(ИмФВх.ИмФВых).

сортировка:-