
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ
УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ
«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М.А. БОНЧ-БРУЕВИЧА»
(СПбГУТ)
ФАКУЛЬТЕТ ИНФОКОММУНИКАЦИОННЫХ СЕТЕЙ И СИСТЕМ (ИКСС)
КАФЕДРА ПРОГРАММНОЙ ИНЖЕНЕРИИ И ВЫЧИСЛИТЕЛЬНОЙ ТЕХНИКИ (ПИ И ВТ)
ДИСЦИПЛИНА: «Логическое и функциональное программирование»
Лабораторная работа №6.
«База знаний на основе Японско-Английского словаря»
Выполнил:
Козлов Н.С.
Подпись____________
Принял:
Ерофеев С.А.
Подпись____________
«_____»________ 2022
Оглавление
Цель работы 3
Структура таблицы 3
Примеры работы программы 4
Пример файла базы знаний 7
Код программы 8
Вывод 9
Цель работы
Разработать программу на языке логического программирования Prolog, выполняющую функции базы знаний.
Программа должна иметь следующий функционал:
Вывод базы знаний на экран.
Ввод новых значений в базу знаний.
Запись базы знаний в файл.
Чтение базы знаний из файла.
Очитку базы знаний.
Структура таблицы
База знаний содержит следующие поля: Японская запись слова латинскими буквами (romaji), перевод слова на Английский, Unicode входящих в слово иероглифов.
Юникод запись иероглифов нужна для дальнейшего поиска иероглифов через цифровые источники в интернет. Например, юникод 0x9752 будет обозначать иероглиф 葵. Такое решение связано с невосприимчивостью прологом юникода.
-
Ромадзи
Перевод на Английский
Unicode
okiruau
to meet
0x4f1a
aoi
blue
0x9752
Примеры
работы программы
Пример файла базы знаний
JLPTN5.DBA |
okiruau;to meet;0x4f1a aoi;blue;0x9752 akai;red;0x8d64 akarui;light, bright;0x660e aki;autumn, fall;0x79cb aku;open;0x958b ii, yoi;good;0x826f iie;no;- iku;to go;0x884c ikura;how much;- ike;pond;0x6c60 itai;to be painful;0x75db ichi;one;0x4e00 ichinichi;one day;0x65e5 ichiban;No. 1, the best, the first;0x756a itsu;when;- issho;together;0x7dd2 ue;top, on, above;0x4e0a ushiro;back, rear, behind;0x5f8c usui;thin;0x8584 uta;song;0x6b4c utau;to sing;0x6b4c uchi;home;0x5185 umareru;to be born;0x751f umi;sea;0x6d77 uru;to sell;0x58f2 uwagi;coat, jacket;0x4e0a,0x7740 e;picture;0x7d75 eiga;movie;0x6620,0x753b eigakan;cinema;0x6620,0x753b,0x9928 eigo;English language;0x82f1,0x8a9e ee;Yes, I see;- eki;station;0x99c5 erebeeta;elevator;- en;Yen;0x5186 enpitsu;pencil;0x925b,0x7b46 oishii;tasty, delicious;0x7f8e,0x5473 ookii;big;0x5927 oozei;many people;- okaasan;my own mother;0x6bcd okashi;confectionary,cake;0x83d3,0x5b50 okane;money;0x91d1 okiru;to get up, to stand up;0x8d77 oku;to put, to place;0x7f6e okusan;someone’s wife;0x5965 okuru;to send;0x9001 osake;alcohol,sake;0x9152 osara;plate;0x76bf ojisan;uncle;0x4f2f,0x7236 ojiisan;grand father;- osu;to push;0x62bc osoi;late, slow;0x9045 ocha;tea;0x8336 |
Код программы
JISHO.PRO |
domains int = integer str = string ss = string* predicates fill(int, int, int, str) empty(int, int, int, str) pour(int, int, int, int, int, int, str) find(int, int, int) find_1(int, int, int, int, int, int, int, ss) find_2(int, int, int, int, int, int, int, ss) output(int, ss, int, ss) clauses fill(K, 0, K, S):- format(S, "Fill % liter container", K),!. fill(_, X, X, "").
empty(K, K, 0, C):- format(C, "Empty % liter container", K),!. empty(_, X, X, "").
pour(K1, A, A1, K2, B, K2, C):- A + B > K2, A1 = A + B - K2, !, format(C, "Fill %-liter container from % liter container", K2, K1). pour(K1, A, 0, K2, B, B1, C):- B1 = A + B, !, format(C, "Pour into %-liter container from % liter container", K2, K1).
find(_,X,X):- write("Number of transfusions = 1"), !. find(X,_,X):- write("Number of transfusions = 1"), !. find(K1, K2, X):- K1 < K2, write("Frist container must be greater than second one"), nl, !. find(K1, K2, X):- K1 > X, write("Containers must be less than X"), nl, !. find(K1, K2, X):- find_1(K1,0,K2,0,X,0,X1,Steps1), find_2(K1,0,K2,0,X,0,X2,Steps2), output(X1, Steps1, X2, Steps2).
find_1(_,X,_,_,X,H,H,[]):-!. find_1(_,_,_,X,X,H,H,[]):-!. find_1(K1, A, K2, B, X, H, F, [Fill,Empty,Pour|Steps]):- fill(K1, A, A1, Fill), empty(K2, B, B1, Empty), pour(K1, A1, A2, K2, B1, B2, Pour), Ch1=H+1,!, find_1(K1, A2, K2, B2, X, CH1, F, Steps).
find_2(_,X,_,_,X,H,H,[]):-!. find_2(_,_,_,X,X,H,H,[]):-!. find_2(K1, A, K2, B, X, H, F, [Fill,Empty,Pour|Steps]):- empty(K1, A, A1, Empty), fill(K2, B, B1, Fill), pour(K2, B1, B2, K1, A1, A2, Pour), Ch1=H+1,!, find_2(K1,A2,K2,B2,X,CH1,F,Steps).
output(N1, Steps1, N2, _):- N1 < N2, !, write("Number of transfusions = ", N1), nl, write("Steps: ", Steps1), nl. output(_,_,H,Steps):- write("Number of transfusions = ", H), nl, write("Steps: ", Steps), nl. |
Вывод
Программа, написанная на языке логического программирования Prolog выполняет поставленную задачу. Пользователь может пополнять базу знаний новыми данными, а так же записывать имеющуюся базу знаний во внешний файл для переноса на другое устройство.