Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабы / Сем 1 / 5-6 / Лабораторная работа №5-6

.docx
Скачиваний:
3
Добавлен:
15.08.2023
Размер:
61.95 Кб
Скачать

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ

УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ

«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ

ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М.А. БОНЧ-БРУЕВИЧА»

(СПбГУТ)

ФАКУЛЬТЕТ ИНФОКОММУНИКАЦИОННЫХ СЕТЕЙ И СИСТЕМ (ИКСС)

КАФЕДРА ПРОГРАММНОЙ ИНЖЕНЕРИИ И ВЫЧИСЛИТЕЛЬНОЙ ТЕХНИКИ (ПИ И ВТ)

ДИСЦИПЛИНА: «Логическое и функциональное программирование»

Лабораторная работа №6.

«База знаний на основе Японско-Английского словаря»

Выполнил:

Козлов Н.С.

Подпись____________

Принял:

Ерофеев С.А.

Подпись____________

«_____»________ 2022

Оглавление

Цель работы 3

Структура таблицы 3

Примеры работы программы 4

Пример файла базы знаний 7

Код программы 8

Вывод 9

Цель работы

Разработать программу на языке логического программирования Prolog, выполняющую функции базы знаний.

Программа должна иметь следующий функционал:

  1. Вывод базы знаний на экран.

  2. Ввод новых значений в базу знаний.

  3. Запись базы знаний в файл.

  4. Чтение базы знаний из файла.

  5. Очитку базы знаний.

Структура таблицы

База знаний содержит следующие поля: Японская запись слова латинскими буквами (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 выполняет поставленную задачу. Пользователь может пополнять базу знаний новыми данными, а так же записывать имеющуюся базу знаний во внешний файл для переноса на другое устройство.