Материал: ЛиФП. Лабораторная работа 6

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Федеральное агентство связи ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ

ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ «САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М. А. БОНЧ-БРУЕВИЧА» (СПбГУТ)

Факультет инфокоммуникационных сетей и систем Кафедра программной инженерии и вычислительной техники

ЛАБОРАТОРНАЯ РАБОТА №6 по дисциплине «Логическое и функциональное программирование»

Выполнил: студент 3-го курса дневного отделения группы ИКПИ-85

Коваленко Леонид Александрович Преподаватель:

доцент кафедры ПИиВТ Ерофеев Сергей Анатольевич

Санкт-Петербург

2020

Постановка задачи

Написать программу на языке Turbo Prolog 2.0 для работы с базой данных пьезоматериалов.

Схема решения База данных будет содержать одну таблицу — таблицу

пьезоматериалов, столбцы которой перечислены далее:

1.Name — название пьезоматериала.

2.Source — изготовитель.

3.Density — плотность пьезоматериала.

4.Структура, содержащая константы-параметры пьезоматериала: C11E,

C12E,

C13E,

C33E,

C44E,

C11D,

C12D,

C13D,

C33D,

C44D,

S11E,

S12E,

S13E,

S33E,

S44E,

S11D,

S12D,

S13D,

S33D,

S44D,

E31,

E33,

E15,

D31,

D33, D15, H31, H33, H15, G31, G33, G15, E11S, E33S, E11T, E33T.

Предполагаются следующие возможности программы:

1.Добавление пьезоматериала с консоли;

2.Добавление пьезоматериалов с CSV-файла;

3.Отображение пьезоматериалов в консоли;

4.Отображение списка изготовителей пьезоматериалов;

5.Редактирование пьезоматериалов;

6.Удаление пьезоматериала по названию;

7.Удаление всех пьезоматериалов;

8.Сохранение пьезоматериалов в CSV-файл.

2

Код программы Входные данные поступают с клавиатуры либо файла, пример

содержимого которого приведен в табл. 1.

Таблица 1 — Входные данные в файле (сверху) и описание столбцов (снизу)

P-5C;Piezotite;8;3;4;2;0.0126;-0.0047;-0.0053;0.0128;0.0316;-0.0001;0.00016;0.00027;1230;1550

P-5E;Piezotite;7.8;3;4;2;0.0124;-0.0041;-0.0052;0.0143;0.034;-0.0001;0.0002;0.0003;1490;1510

P-6C;Piezotite;7.7;3;4;2;0.0094;-0.003;-0.003;0.0103;0.0256;-8E-05;0.00019;0.00029;760;800

Название_пьезоматериала; Изготовитель_пьезоматериала; Плотность_пьезоматериала;

Номер elastic constants для ввода (CE=1, CD=2, SE=3, SD=4);

Номер piezoelectric constants для ввода (E=1, D=2, H=3, G=4);

Номер permittivities constants для ввода (ES=1, ET=2);

5 elastic constants;;;;;

3 piezoelectric constants;;;

2 permittivities constants;

Код программы приведен в табл. 2.

Таблица 2 — Код программы

NOWARNINGS

%Раздел описания доменов

DOMAINS

file = datafile reals = real*

/* const_list = cl(C11E, C12E, C13E, C33E, C44E, C11D, C12D, C13D, C33D, C44D, S11E, S12E, S13E, S33E, S44E, S11D, S12D, S13D, S33D, S44D, E31, E33, E15, D31, D33, D15, H31, H33, H15, G31, G33, G15, E11S, E33S, E11T, E33T) */

const_list = cl(real, real, real, real, real, real, real, real, real, real, real, real, real, real, real, real, real, real, real, real, real, real, real, real, real, real, real, real, real, real, real, real, real, real, real, real)

/* priv_const_list = pcl(C11E, C12E, C13E, C33E, C44E, E31, E33, E15, E11S, E33S, Reg_C, Reg_e, Reg_s) */ priv_const_list = pcl(real, real, real, real, real, real, real, real, real, real, integer, integer, integer) strings = string*

const_matrix = const_list*

%Раздел описания предикатов

PREDICATES if_x_equals_0_then_1_else_x(real, real)

get_ce(integer, integer, integer, const_list, const_list) get_cd(integer, integer, integer, const_list, const_list) get_se(integer, integer, integer, const_list, const_list) get_sd(integer, integer, integer, const_list, const_list) get_e(integer, integer, integer, const_list, const_list) get_d(integer, integer, integer, const_list, const_list) get_h(integer, integer, integer, const_list, const_list) get_g(integer, integer, integer, const_list, const_list) get_et(integer, integer, integer, const_list, const_list) get_es(integer, integer, integer, const_list, const_list) get_constants(priv_const_list, const_list) get_constants_aux(integer, integer, integer, const_list, const_list) get_constants_aux1(real, const_list, const_list) get_constants_aux2(real, const_list, const_list)

eq1(real, reals, reals, reals, reals, reals) eq2(real, reals, reals, reals, reals, reals) eq3(real, reals, reals, reals)

start() menu() choose(string)

insert_into_database(string, string, const_list, real) dialog_str_delete_from_database_by_name() dialog_str_clear_database()

read_real_greater_0(real)

read_variant(integer, integer, integer, integer) choose_variant(integer, integer, integer, integer, integer) dialog_str_set_elastic_constants_from_console(integer, priv_const_list)

pre_dialog_str_set_elastic_constants_from_console(integer, real, real, real, real, real) enter_elastic_constants(real, real, real, real, real, string, string, string, string, string) dialog_str_set_piezoelectric_constants_from_console(integer, priv_const_list) pre_dialog_str_set_piezoelectric_constants_from_console(integer, real, real, real) enter_piezoelectric_constants(real, real, real, string, string, string) dialog_str_set_permittivities_from_console(integer, priv_const_list) pre_dialog_str_set_permittivities_from_console(integer, real, real) enter_permittivities(real, real, string, string)

dialog_str_read_from_file() dialog_str_read_from_console() dialog_str_read_from_console_1(string, string, real) dialog_str_read_from_console_2(priv_const_list)

3

dialog_str_read_from_console_3(priv_const_list) dialog_str_read_from_console_4(priv_const_list) dialog_str_show_data()

print_database()

print_database(strings, strings, const_matrix, reals) print_enter_rows(strings, strings, const_matrix, reals) print_enter_rows(strings, strings, const_matrix, reals, string) print_consts(const_list)

dialog_str_save_into_file() print_format_consts(const_list) exists(string)

read_rows()

front_string(string, string, string) clear_database() dialog_str_show_by_source()

read_cmd(string, string, const_list, real, string) print_sources(strings, integer) remove_duplicates(strings, strings)

member(string, strings) delete3(string, strings, strings)

material_edit(string, string, const_list, real, string, string, const_list, real) choose_edit(integer, string, string, const_list, real, string, string, const_list, real) material_edited()

should_be_positive(string, real) should_be_negative(string, integer, real, integer, integer) log_str(String)

length(strings, integer) get(strings, integer, string)

%Раздел описания базы данных

DATABASE

piezomaterial(string, string, const_list, real) % piezomaterial(Name, Source, Constants, Density)

%Раздел описания внутренней цели

GOAL

 

 

 

 

start().

 

 

 

 

% Раздел описания предложений

 

 

 

 

CLAUSES

 

 

 

 

length([], 0).

 

 

 

 

length([_|Xs], N) :-

 

 

 

 

length(Xs, P),

 

 

 

 

N = P + 1.

 

 

 

 

get([Head|_], 0, X) :- X = Head.

 

 

 

 

get([_|Tail], I, X) :- I1 = I - 1, get(Tail, I1, X).

 

 

start() :- makewindow(1, 15, 15, "Piezomaterial", 1, 0, 24, 80), menu().

 

menu() :-

 

 

 

 

clearwindow(),

 

 

 

 

write("

*************************

"), nl,

write("

*

MENU

*

"), nl,

write("

*************************

"), nl,

write("

*

1. Add from console

*

"), nl,

write("

*************************

"), nl,

write("

*

2. Add from file

*

"), nl,

write("

*************************

"), nl,

write("

*

3. Show data

*

"), nl,

write("

*************************

"), nl,

write("

*

4. Show by source

*

"), nl,

write("

*************************

"), nl,

write("

*

5. Delete by name

*

"), nl,

write("

*************************

"), nl,

write("

*

6. Clear

*

"), nl,

write("

*************************

"), nl,

write("

*

7. Save into file

*

"), nl,

write("

*************************

"), nl,

write("

*

0. Exit

*

"), nl,

write("

*************************

"), nl,

write("

int>"), readln(S), clearwindow(), choose(S), menu(); menu().

choose(S) :-

 

S = "0", !, exit;

 

S = "1", !, dialog_str_read_from_console();

S = "2", !, dialog_str_read_from_file();

 

S = "3", !, dialog_str_show_data();

 

S = "4", !, dialog_str_show_by_source();

 

S = "5", !, dialog_str_delete_from_database_by_name();

S = "6", !, dialog_str_clear_database();

 

S = "7", !, dialog_str_save_into_file().

 

dialog_str_show_by_source() :-

 

 

 

 

findall(Source, piezomaterial(_, Source, _, _), Sources), not(Sources = []), !,

 

write("

****************************

"), nl,

write("

 

ENTER SOURCE

 

"), nl,

remove_duplicates(Sources, SList), print_sources(SList, 1),

 

write("

****************************

"), nl,

length(SList, L), read_variant(N, 1, L, 0), N1 = N - 1, get(SList, N1, S),

 

findall(Name, piezomaterial(Name, _, _, _), Names),

 

 

findall(Consts, piezomaterial(_, _, Consts, _), ConstsList),

 

findall(Density, piezomaterial(_, _, _, Density), Densitys),

 

print_enter_rows(Names, Sources, ConstsList, Densitys, S);

 

write("

***********************

"), nl,

write("

*

NO DATA!

*

"), nl,

write("

***********************

"), nl,

write("

 

any>"), readln(_).

 

member(Name,[Name |_]) :- !.

 

 

 

 

member(Name,[_ |Tail]):- member(Name,Tail). delete3(_,[],[]) :- !.

4

delete3(X,[X|T],R):- !, delete3(X,T,R).

 

 

 

delete3(X,[H|T],[H|R]) :- delete3(X,T,R).

 

 

 

remove_duplicates([],[]) :- !.

 

 

 

 

remove_duplicates([H|T], [H|R]) :-

 

 

 

 

member(H,T),!,

 

 

 

 

delete3(H,T,R1),

 

 

 

 

remove_duplicates(R1,R).

 

 

 

 

remove_duplicates([H|T],[H|R]):-

 

 

 

 

remove_duplicates(T,R).

 

 

 

 

print_sources([], _) :- !.

 

 

 

 

print_sources([Source|Tail], N) :-

 

 

 

 

writef("

%3d. %s", N, Source), nl, N1 = N + 1, print_sources(Tail, N1).

print_enter_rows([], [], [], [], TSource) :-

 

 

 

write("

***********************

"), nl,

write("

*

DONE!

*

"), nl,

write("

***********************

"), nl,

write("

 

any>"), readln(_).

 

print_enter_rows([Name|NT], [Source|ST], [Consts|CT], [Density|DT], TSource) :-

 

Source = TSource,

 

 

 

 

clearwindow(),

 

 

 

 

write("*****************************************************************************"), nl,

write("* Name: ", Name), nl,

 

 

 

 

write("* Source: ", Source), nl,

 

 

 

 

write("* Density: ", Density), nl,

 

 

 

print_format_consts(Consts), write("*****************************************************************************"), nl,

write("

 

next>"), readln(C), read_cmd(Name, Source, Consts, Density, C),

print_enter_rows(NT, ST, CT, DT, TSource);

 

 

Source = TSource, !;

 

 

 

 

Source <> TSource, print_enter_rows(NT, ST, CT, DT, TSource).

 

insert_into_database(Name, Source, Consts, Density) :-

 

 

assertz(piezomaterial(Name, Source, Consts, Density)).

 

 

dialog_str_read_from_file() :-

 

 

 

 

write("

****************************

"), nl,

write("

*

ENTER FILE NAME

*

"), nl,

write("

****************************

"), nl,

write("

 

string>"), readln(Filename), exists(Filename),

 

openread(datafile, Filename), readdevice(datafile), read_rows(),

 

closefile(datafile), readdevice(keyboard),

 

 

write("

**********************

"), nl,

write("

*

DONE!

*

"), nl,

write("

**********************

"), nl,

write("

 

any>"), !, readln(_);

 

write("

**************************

"), nl,

write("

*

MATERIALS NOT ADDED!

*

"), nl,

write("

**************************

"), nl,

write("

 

any>"), readln(_).

 

exists(Filename) :-

 

 

 

 

existfile(Filename), !;

 

 

 

 

write("

****************************

"), nl,

write("

*

FILE NOT FOUND

*

"), nl,

write("

****************************

"), nl,

write("

 

any>"), readln(_), !, fail.

 

read_rows() :-

 

 

 

 

not(eof(datafile)),

 

 

 

 

readln(Line),

 

 

 

 

front_string(Line, Name, Tail1),

 

 

 

 

front_string(Tail1, Source, Tail2),

 

 

 

front_string(Tail2, Density_STR, Tail3), str_real(Density_STR, Density),

front_string(Tail3, Reg_C_STR, Tail4),

str_int(Reg_C_STR, Reg_C), Reg_C >= 1, Reg_C <= 4,

front_string(Tail4, Reg_e_STR, Tail5),

str_int(Reg_e_STR, Reg_e), Reg_e >= 1, Reg_e <= 4,

front_string(Tail5, Reg_s_STR, Tail6),

str_int(Reg_s_STR, Reg_s), Reg_s >= 1, Reg_s <= 2,

front_string(Tail6, C11E_STR, Tail7),

str_real(C11E_STR, C11E), should_be_positive(Line, C11E),

front_string(Tail7, C12E_STR, Tail8),

str_real(C12E_STR, C12E), should_be_negative(Line, Reg_C, C12E, 3,

4),

 

front_string(Tail8, C13E_STR, Tail9),

str_real(C13E_STR, C13E), should_be_negative(Line, Reg_C, C13E, 3,

4),

 

front_string(Tail9, C33E_STR, Tail10),

str_real(C33E_STR, C33E), should_be_positive(Line, C33E),

front_string(Tail10, C44E_STR, Tail11), str_real(C44E_STR, C44E), should_be_positive(Line, C44E),

front_string(Tail11, E31_STR, Tail12),

str_real(E31_STR, E31), should_be_negative(Line, Reg_e, E31, 1, 1),

front_string(Tail12, E33_STR, Tail13),

str_real(E33_STR, E33), should_be_positive(Line, E33),

front_string(Tail13, E15_STR, Tail14),

str_real(E15_STR, E15), should_be_positive(Line, E15),

front_string(Tail14, S11_STR, Tail15), str_real(S11_STR, E11S), should_be_positive(Line, E11S), front_string(Tail15, S33_STR, _), str_real(S33_STR, E33S), should_be_positive(Line, E33S), get_constants(pcl(C11E, C12E, C13E, C33E, C44E, E31, E33, E15, E11S, E33S, Reg_C, Reg_e, Reg_s), Consts), insert_into_database(Name, Source, Consts, Density), !, read_rows();

not(eof(datafile)), !,

 

 

 

 

write("

**********************************

"), nl,

write("

*

READING ERROR!

*

"), nl,

write("

*

REMAINING DATA WAS NOT READ!

*

"), nl,

write("

*

SOME MATERIALS ADDED!

*

"), nl,

write("

**********************************

"), nl; !.

should_be_positive(Line, C1XE) :-

 

 

 

C1XE > 0, !;

 

 

 

 

write("See: ", Line), nl,

 

 

 

 

write("

 

\'", C1XE, "\' should be > 0!"), nl, fail.

 

should_be_negative(Line, Reg_C, C1XE, T1, T2) :-

 

 

Reg_C = T1, C1XE >= 0, !,

 

 

 

 

write("See: ", Line), nl,

 

 

 

 

write("

 

\'", C1XE, "\' should be < 0!"), nl, fail;

 

Reg_C = T2, C1XE >= 0, !,

 

 

 

 

write("See: ", Line), nl,

 

 

 

 

write("

 

\'", C1XE, "\' should be < 0!"), nl, fail;

 

5

Источник: https://studfile.net/preview/16431667/