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

Введите свое имя: Наташа Доброе утро, Наташа Я рада Вас видеть

5.2. «Счастливыйбилет»

Правила такого типа удобно использовать при организации диалога в программах на Прологе. Например, рассмотрим задачу проверки билета на то - «счастливый» он или нет «Счастливым» билетом считается тот, который имеет какое-то определенное сочетание цифр. Например, в Москве «счастливым» билетом считают тот, у которого сумма первых трех цифр равна сумме трех последних, в Киеве - если сумма всех цифр кратна трем, в Санкт-Петербурге - если сумма цифр на четных местах равна сумме цифр на нечетных. В результате решения этой задачи получается следующая программа на Прологе:

О/          __             __     _       „       _____        __       -.

/и ————-■•————— —————     .__—____.._■_____,__>_____*     ._,—   ____ _

% Счастливый билет

о/____________

/О                                          ——-.— ——------ ___,------ ____,_,_____,__-__-__—_—_»т->——. — -.——

domains цифра=1п!едег

predicates

работа мсб(цифра, цифра, цифра, цифра, цифра, цифра)

лсб(цифра, цифра, цифра, цифра, цифра, цифра)

ксб(цифра,цифра,цифра.цифра,цифра,цифра)

счастливый_билет(цифра,цифра,цифра, цифра, цифра, цифра)

clauses работа:-


\л/гие("Введите шесть цифр вашего билета: "),nl, readint(A),readint(B),readint(C), readint(D),readint(E),readint(F),nl, счастливый_билет(А,В,С,О,Е,Р).

счастливый_билет(А,В,С,О,Е,Р):mc6(A,B,C,D,E,F). счастливый_билет(А,В,С,О,Е,Р):nc6(A,B,C,D,E,F). счастливый_ билет(А,В C,D,E,F):kc6(A,B,C,D,E,F).

mc6(A,B,C,D.E,F):-A+B+C=D+E+F, write("BnneT счастливый по-московски!"),nl.

nc6(A,B,C,D,E,F):-B+D+F=A+C+E, write("5nneT счастливый по-Санкт-Петрбужски!"),п1.

kc6(A,B,C,D,E,F):-X=(A+B+C+D+E+F) mod 3,X=0, write("BnneT счастливый по-киевски!."),nl.

goal clearwindow,работа

Правила «мсб», «лсб» и «кеб» проверяют, счастливый ли билет по различным критериям. Правило «работа» вводит исходные данные и вызывает правила проверки.

Кроме перечисленных встроенных предикатов в программах на Прологе можно использовать следующие функции для обработки строк:

concat(X,Y,Z) - сливает воедино строки X и Y и записывает результат в строку Z.

str_!en(S,L) - подсчитывает длину строки S и записывает результат в переменную L.

str_int(S,N) - преобразует целое число в строку, или наоборот.


5.3. Переводчиселвслова (числительные)

Например, рассмотрим задачу перевода натуральных чисел от

1 до 100 в слова. Сначала «научим» машину переводить единицы. Для этого введем в базу знаний факты:

единицы(1, «один»).

единицы(2, «два»).

единицы(3, «три»).

единицы(4, «четыре»).

единицы(5, «пять»).

единицы(6, «шесть»).

единицы(7, «семь»).

единицы(8, «восемь»).

единицы(9, «девять»).

Для перевода чисел будем использовать правила «перевод». Для единиц это правило будет выглядеть так:

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

Затем запишем правила перевода чисел второго десятка - от 11 до 19 Конечно, можно написать правила, аналогичные переводу чисел до девяти. Однако, нетрудно заметить что правила образования чисел от четырнадцати до девятнадцати одинаковы отделяются единицы, берется соответствующее название (например, «пять»), последняя буква отбрасывается («пят») и добавляется окончание «надцать» («пятнадцать») Поэтому для перевода этих


чисел можно написать следующее правило:

перевод(Х,У):-Х>13, Х<20, 2=Хmod Ю.единицы^, Т), str_len(T, L), K=L-1,

frontstr(K,T,T1,_), concat(T1, «надцать», Y).

Это правило работает так:

1. определяется, что число лежит в интервале от 14 до 19: Х>13«и»Х<20;

2. определяются единицы и записываются в переменную Z: Z=X mod 10;

3. по правилу «единицы» получается слово, соответствующее им: единицы(г, Т);

4 определяется длина этого слова и из нее вычитается 1: str_len(T, L), K=L-1;

5. выделяется подстрока Т1 без последней буквы (на одну букву ко роче):

frontstr(K,T,T1,J;

6. добавляется «надцать»: concat(T1, «надцать», Y).

Для перевода остальных чисел от 11 до 19 можно просто записать факты: перевод(11, «одиннадцать»). перевод(12, «двенадцать»). перевод(13, «тринадцать»).

Теперь запишем правило перевода десятков: 10, 20, ..., 100. Правило «перевод»в этом случае будет выглядеть так: