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

лп / Krtuvorychko / otchet_6

.doc
Скачиваний:
0
Добавлен:
09.02.2016
Размер:
56.32 Кб
Скачать

Міністерство освіти і науки, молоді і спорту України

Кіровоградський національний технічний університет

Механіко-технологічний факультет

Кафедра програмного забезпечення

Дисципліна: « Логічне програмування »

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

Тема: «Робота зі списками на мові програмування Turbo Prolog»

Виконав: ст. групи КІ-12-СК

Криворучко О.В.

Перевірив: викладач

Резніченко В.А.

Кіровоград 2013

Мета: Розглянути організацію спискових інформаційних структур та виконання основних операцій над ними на мові програмування Turbo Prolog.

Завдання:

Створити два списки: список прізвищ (наприклад своїх одногрупників) і список їх оцінок по будь-якому предмету. Представити у вигляді меню такі операції над цими списками:

  1. Пощук заданого елемента в списку;

  2. Поділ списку за заданим дільником;

  3. Приєднання списків;

  4. Сортування списку.

Лістинг програми:

domains

sp=symbol*

s=symbol

in=integer*

i=integer

str=string*

predicates

search(s,sp)

students(sp)

ocenki(in)

poisk

menu

vukluk(i)

rep

add

s1(i,in,in,in)

ap(sp,sp,sp)

f(s,sp)

sort(sp,sp)

podil

insert(s,sp,sp)

sortirovka

ord(s,s)

clauses

ocenki([4,3,4,5,3,5]).

students(["Ятел","Иванченко","Суковач","Махонина",

"Парий","Гарбуз"]).

%ЗАВДАННЯ 1

search(A,[A|_]).

search(A,[_|B]):-search(A,B).

poisk:-

students(X),write("Введить призвище"),nl,

readln(C),search(C,X),write("Так"),!;

write("Нет").

%ЗАВДАННЯ 2

s1(X,[G|H],[G|H1],H2):-G<=X,s1(X,H,H1,H2).

s1(X,[G|H],H1,[G|H2]):-s1(X,H,H1,H2),G>X.

s1(_,[],[],[]).

podil:-

write("Введите дильник "),nl,readint(Z),

s1(Z,[4,3,4,5,3,5],X,Y),

write("X: ",X),nl,write("Y: ",Y).

%ЗАВДАННЯ 3

ap([],X,X).

ap([X|X1],X2,[X|X3]):-ap(X1,X2,X3).

f(X,[X|[]]).

add:-

write("Введите новую фамилию"),nl,

students(X1),readln(Y1),

f(Y1,Y2),ap(X1,Y2,Y3),write(Y3).

%ЗАВДАННЯ 4

sort([],[]).

sort([X|Y],S1):-sort(Y,S2),insert(X,S2,S1).

insert(X,[Y|S1],[Y|S3]):-ord(X,Y),!,insert(X,S1,S3).

insert(X,S1,[X|S1]).

ord(X,Y):-X>Y.

sortirovka:-

students(X),sort(X,Y),write(Y).

vukluk(1):-poisk,nl.

vukluk(2):-podil,nl.

vukluk(3):-add,nl.

vukluk(4):-sortirovka,nl.

vukluk(0):-write("Вих1д").

rep.

rep:-rep.

menu:-rep,

write("1 - пошук елемента"),nl,

write("2 - подил"),nl,

write("3 - додати пр1звище "),nl,

write("4 - сортування"),nl,

write("0 - вих1д"),nl,

readint(X),vukluk(X),X=0,!.

goal

menu.

Результат:

1) Додавання елемента в список

2) Поділ елементів

3) Сортування елементів

4) Пошук елемента

Контрольні питання:

  1. Яким чином створити спискову структуру в Turbo Prolog?

Приклад:

domains

groups = integer* /*Символ * означає, що groups – це тип змінних, що являє собою список цілих чисел */

predicates

list(groups) /* list – змінна типу groups (список цілих чисел) */

clauses

list ([1,2,3]) /* В програмі створено список цілих чисел з трьох елементів, складові елементи списка перераховані через кому в квадратних дужках */

  1. Що таке голова та хвіст списку?

Голова-це перший елемент списку(без розділювача «|») або елементи до розділювача. Хвіст-решта елементів після розділювача.

3. Як в Turbo Prolog здійснити поділ списку за заданим дільником?

Приклад:

domains

m = integer /* або m = symbol */

l = integer* /* або l = symbol* */

predicates

s (m,l,l,l)

clauses

s (X, [G | H], [G | H1], H2): - G<=X, s (X,H,H1,H2).

s (X, [G | H]; H1, [G | H2]): - s (X,H,H1,H2), G>X.

s ( _, [ ], [ ], [ ] ). /* [ ] – порожній список */

goal

s(5, [3,7,8,5], X, Y). /* або s (“d”, [“a”,“f”,“b”, “e”], X, Y) */

Відповідь: X = [3,5], Y = [7,8]. /* або X = [“a”, “b”], Y = [“f”, “e”] */

Принцип поділу списків:

  • Черговий елемент видобувається зі списка за допомогою поділу списка на “голову” и “хвост”, а потім порівнюється з першим аргументом предиката s. Якщо значення цього елемента співпадає зі значенням аргумента або менше його, то елемент розміщується в перший із списків Х. В протилежному випадку в другий список – Y.

4. Чи можна в Turbo Prolog здійснити введення списку з клавіатури?

Приклад:

domains

s = symbol

sp = symbol*

predicates

ap (sp,sp,sp)

r

g

clauses

ap ([ ],Х,Х).

ap ([X | X1], X2, [X | X3]): - readln(X), X<> “ ”, ap (X1,X2,X3).

r.

r: - r.

g: - r, ap (_ , [ ], Z), write(Z), nl, fail.

3

Соседние файлы в папке Krtuvorychko