перевод(Х,У):- Х>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ификатор,ДосИмя) - открытие файла как входного потока
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.