лп / Krtuvorychko / otchet_6
.docМіністерство освіти і науки, молоді і спорту України
Кіровоградський національний технічний університет
Механіко-технологічний факультет
Кафедра програмного забезпечення
Дисципліна: « Логічне програмування »
Лабораторна робота № 6
Тема: «Робота зі списками на мові програмування Turbo Prolog»
Виконав: ст. групи КІ-12-СК
Криворучко О.В.
Перевірив: викладач
Резніченко В.А.
Кіровоград 2013
Мета: Розглянути організацію спискових інформаційних структур та виконання основних операцій над ними на мові програмування Turbo Prolog.
Завдання:
Створити два списки: список прізвищ (наприклад своїх одногрупників) і список їх оцінок по будь-якому предмету. Представити у вигляді меню такі операції над цими списками:
-
Пощук заданого елемента в списку;
-
Поділ списку за заданим дільником;
-
Приєднання списків;
-
Сортування списку.
Лістинг програми:
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) Пошук елемента
Контрольні питання:
-
Яким чином створити спискову структуру в Turbo Prolog?
Приклад:
domains
groups = integer* /*Символ * означає, що groups – це тип змінних, що являє собою список цілих чисел */
predicates
list(groups) /* list – змінна типу groups (список цілих чисел) */
clauses
list ([1,2,3]) /* В програмі створено список цілих чисел з трьох елементів, складові елементи списка перераховані через кому в квадратних дужках */
-
Що таке голова та хвіст списку?
Голова-це перший елемент списку(без розділювача «|») або елементи до розділювача. Хвіст-решта елементів після розділювача.
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.