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


перевод(Х,У):- Х>9, Z1=X mod 10,Z1=0, Z=X div 10, десятки(г, Y).

Т.е. если число кратно 10, то берется количество десятков и переводится с помощью правила или факта «десятки».

Для перевода чисел 10, 40, 90, 100 снов можно записать следующие факты:

десятки(1, «десять»).

десятки{4, «сорок»).

десятки(9, «девяносто»).

десятки(10, «сто»).

(Обратите внимание на пробел в конце десятков: он нужен для того, чтобы при выводе числа единицы и десятки отделялись друг от друга).

Для перевода 20 и 30 нужно к количеству десятков добавить окончание «дцать». Правило будет такое:

десятки(Х.У):- Х>1, Х<4, единицы(Х, Т), concat(T, «дцать», Y).

Для целых десятков от 50 до 80 также есть общее правило перевода: надо взять количество десятков и добавить к нему окончание «десят». На Прологе это правило запишется так:

десятки(Х, Y):- Х>4, Х<9, единицы(Х, Т), concat(T, «десят», Y).

И, наконец, запишем- правило для перевода всех остальных чисел. Для этого используем уже написанные правила перевода десятков и единиц.

перевод(Х, Y):-


Х>20, А=Хmod 10, 2=Хdiv 10, А<10, десятки(2, Р), единицы(А, Q), concat(P, Q, Y).

А теперь можно добавить правило «работа»:

работа:- \лтИе(«Введите числоот 1 до 100»), nl, readint(X), перевод(Х, Y), nl, «/гКе(«Получили», Y).

А задав вопрос: Цель: работа

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

% Перевод чисел от 1 до 100 в соответствующие им % числительные (один - сто)

predicates

eflHHHUbi(integer,string)

nepeBOfl(Jnteger,string)

flec«TKH(integer,strmg)

работа                                         i

clauses

единицы(1, "один"). единицы(2, "два"). единицы(3, "три"). единицы(4, "четыре") единицы(5, "пять"). единицы(6, "шесть"). единицы(7, "семь"). единицы(8, "восемь") единицы(9, "девять")

/**.**.*****«.****..****,*****♦***.***.♦.«.«.«*♦****♦♦*/ %Перевод единиц

перевод(Х.У).- Х<10, единицы(Х.У).


%Перевод чисел второго десятка - от 11 до 19.

перевод(Х.У)Х>13, Х<20, Z=X mod 10,единицы(2, Т), str_len(T, L), K=L-1, frontstr(K,T,T1,J, concat(T1, "надцать", Y).

%Перевод остальных чисел от 11 до 19

перевод(11, "одиннадцать'1). перевод(12, "двенадцать"). перевод(13, "тринадцать")

%Перевод десятков: 10, 20.... 100.

перевод(Х,У):-Х>9, Z1=Xmod 10,Z1=0, Z=Xdiv10, десятки(г, Y).

/.*.«**.,*.**,.**.,***«**.*,*.****..*♦**,*«*.**«♦*,**/

%Перевод всех остальных чисел, исключая целые десятки.

/♦**♦******************♦***************.*****.*********♦*/

перевод(Х, Y):Х>20, А=Х mod 10, Z=X div 10, А<10, десятки^, Р), единицы(А, Q), concat(P, Q, Y).

/*******«*****....****,**♦**********.«**,.****«*.*♦♦**/

%Перевод чисел 10, 40, 90, 100

/****.*,♦♦*,**„♦,.♦**.♦**.*♦***♦,**,♦*****«,,*.♦♦,*,♦**,/

десятки(1, "десять "). десятки(4, "сорок"). десятки(9, "девяносто"). десятки(10, "сто").

% Перевод 20 и 30


десятки(Х.У):-Х>1 Х<4, единицы(Х, Т), concat(T, "дцать ", Y).

%Перевод целых десятков от 50 до 80

/****.**♦*«*************.********♦*****.**».***♦*********/

десятки(Х, Y):-Х>4, Х<9, единицы(Х, Т), concat(T. "десят", Y).

/и»»...............,............. Чшш»ми.».»»,»>../

%Правило "работа":

/**♦******«.*.****,*.«*****.***.****.**..*♦♦*«..******/

работа:шгйе("Введите число от 1 до 100"), nl, readint(X), переводах, Y), ni, \лт1е("Получили ", Y).

goal clearwindow,работа

/*»***************♦*****.*****♦***♦*****♦********♦***.,***/

/*—Конец программы «Перевод чисел»------ */

5.4. Работасфайлами

Для работы с файлами в Прологе существуют специальные встроенные предикаты: openread, openwrite, openappend, openmodify, readdevsce, writedevice, filemode, closefile, filepos, eof, flush, existfile, deletefile, renamefile, disk.

Практически во всех из них используется тип file. Значения констант и переменных этого типа следующие: keyboard; screen; printer; com1; stdin; stdout иопределяемыепользователем

Рассмотрим некоторые из них.

орепгеас)|:Иден7ификатор,ДосИмя) - открытие файла как входного потока