close

Вход

Забыли?

вход по аккаунту

?

ЛП1

код для вставкиСкачать
Цель работы: Первоначальное ознакомление с выбранной системой
программирования на языке Пролог, реализация предикатов обработки
списков в различных представлениях.
Задача:
1) Ознакомиться с одной из систем программирования на языке Пролог на персональной или мини-ЭВМ (J#, GNU Prolog, BinProlog,
CProlog, AMZI Prolog, Visual Prolog, TurboProlog, JLog или др.),
освоить операции загрузки простейших пролог-программ и формулирования запросов.
2) Проверить наличие в системе программирования встроенных стандартных предикатов обработки списков, отразить их применение в
протоколе.
3) Реализовать свои версии стандартных предикатов обработки списков, рассмотренные на занятии (length, member, append, remove,
permute, sublist), и убедиться в их работоспособности на ряде различных запросов. Результат отразить в протоколе.
4) Реализовать специальный предикат обработки списка в соответствии с вариантом задания двумя способами: на основе стандартных предикатов обработки списков и без их использования. Отразить в протоколе различные варианты использования предиката
на модельных запросах. Вариант задания определяется как n mod
20 + 1, где n – порядковый номер студента в группе.
5) Реализовать указанный в задании предикат обработки для порядкового представления списка.
6) Реализовать предикат обработки числового списка (списков) для
стандартного и порядкового представлений в соответствии с вариантом задания и отразить результат его работы в протоколе.
7) Привести какой-нибудь содержательный пример совместного использования предикатов, реализованных в пунктах 3 и 4.
Вариант задания: 14
Знакомство с Prolog.
Для ознакомления с данным языком программирования я использовал SWI Prolog.
Из большого выбора эта среда разработки оказалась оптимальной для моего уровня.
Сходный код программ можно сохранять и изменять с помощью любого текстового
редактора, а компиляция и запуск производится непосредственным щелчком по файлу,
или через команду в консоли consult(‘имя файла.pl’).
Стандартные предикаты для работы со списками обнаруженные в IDE:
member()
поиск в списке
length()
длина списка
append()
слияние списков
permutation()
перестановки списка
delete()
удаление элемента
sublist()
подсписок в списке
Протокол:
1 ?- length([a,b,c], X).
X = 3.
2 ?- length([a,b,c], 3).
true.
3 ?- length([a|T], 3).
T = [_G2045, _G2048].
4 ?- member(a, [b,d,c,a,e]).
true;
false.
5 ?- member(z, [b,d,c,a,e]).
false.
6 ?- member(X, [a,b,c]).
X=a;
X=b;
X = c.
7 ?- append([a,b,c], [d,e,f], X).
X = [a, b, c, d, e, f].
8 ?- append([a,b,c], X, [a,b,c,d,e,f]).
X = [d, e, f].
9 ?- delete([a,a,a,b,c,d,a], a, X).
X = [b, c, d].
10 ?- permutation(X, [a,b,c]).
X = [a, b, c] ;
X = [a, c, b] ;
X = [b, a, c] ;
X = [c, a, b] ;
X = [b, c, a] ;
X = [c, b, a] ;
false.
11 ?- permutation([a,b,c], X).
X = [a, b, c] ;
X = [a, c, b] ;
X = [b, a, c] ;
X = [b, c, a] ;
X = [c, a, b] ;
X = [c, b, a] ;
false.
12 ?- permutation([a,b,c], [b,a,c]).
true ;
false.
Предикаты реализованные идентично найденным:
a_member(X, [X|_]).
a_member(X, [_|T]) :a_member(X, T).
a_length([], 0).
a_length([_|T], N) :a_length(T, N1),
N is N1 + 1.
a_append([], L, L).
a_append([X|L1], L2, [X|R]) :a_append(L1, L2, R).
a_permutation([], []).
a_permutation(List, [X|R]) :a_remove(X, List, Tmp),
a_permutation(Tmp, R).
a_delete(X, [X|T], T).
a_delete(X, [Head|T], [Head|R]) :a_delete (X, T, R).
a_sublist(Sublist, List) :a_append(Sublist, _, Tmp),
a_append(_, Tmp, List).
Протокол:
1 ?- a_remove(a, [a,b,c], X).
X = [b, c] ;
false.
2 ?- a_remove(d, [a,b,c], X).
false.
3 ?- a_remove(a, [a,a,b,c], X).
X = [a, b, c] ;
X = [a, b, c] ;
false.
4 ?- a_remove(X, [a,b,c,d], [a,b,c]).
X=d;
false.
5 ?- a_sublist([a,b], [a,b,c]).
true ;
false.
6 ?- a_sublist([a,X], [a,b,c]).
X=b;
false.
7 ?- a_sublist([a,b,d], [a,b,c]).
false.
Предикат обработки списков. Реализация моего задания на Prolog:
next(X, [X|_]).
getnext(X, [X|Tail], Y):next(Y,Tail).
getnext(X, [_|Tail], Y) :getnext(X, Tail, Y).
Данная программа выполняет поиск заданного элемента и показывает следующий за ним в
списке. Если элемент не найден или находится за пределами списка - возвращается false.
Протокол:
1 ?- getnext(a,[a,b,c,d],Y).
Y=b;
false.
2 ?- getnext(a,[f,b,c,d],Y).
false.
3 ?- getnext(c,[a,b,c,d],Y).
Y=d.
4 ?- getnext(d,[a,b,c,d],Y).
false.
5 ?- getnext(d,[],Y).
false.
6 ?- getnext(d,[d],Y).
false.
7 ?- getnext(d,[d],Y).
Предикат для порядкового представления:
find(X, [X|_]):-!.
getnext(X, [e(_,X)|Tail], Y):find(Y,Tail).
getnext(X, [_|Tail], Y) :getnext(X, Tail, Y).
Протокол:
1 ?- getnext(a,[e(1,a),e(2,b)],X).
X = e(2, b) ;
false.
2 ?- getnext(a,[e(1,a)],X).
false.
3 ?- getnext(a,[e(1,a)],X).
false.
4 ?- getnext(a,[],X).
false.
Предикат обработки числовых списков. Реализация моего задания:
pregeom([F],N):number(F),!.
pregeom([F,S|Tail],N):number(F),
number(S),
S =:= F*N,
pregeom([S|Tail],N).
geom([F]):number(F),!.
geom([F,S|Tail]):number(F),
number(S),
N is S/F,
pregeom([S|Tail],N).
Данная программа проверяет список на геометрическую прогрессию
[an=k*an-1] и выдает true если список действительно похож на
геометрическую прогрессию.
Протокол:
1 ?- geom([1,2,4,8,16,32]).
true.
2 ?- geom([1,2,4,8,16,39]).
false.
3 ?- geom([2,6,18]).
true.
4 ?- geom([0]).
true.
Пример совместного использования предикатов:
test(List,R):geom(List),
a_permutation(List,R).
Данный предикат делает проверку на геометрическую прогрессия и если
все удачно – выводит все перестановки элементов.
Протокол:
1 ?- test([1,2,4],X).
X = [1, 2, 4] ;
X = [1, 4, 2] ;
X = [2, 1, 4] ;
X = [2, 4, 1] ;
X = [4, 1, 2] ;
X = [4, 2, 1] ;
false.
2 ?- test([1,2,4,5],X).
false.
3 ?- test([a],X).
false.
Выводы:
В данной лабораторной работе я научился работать с предикатами нового для меня языка
программирования – Пролог. С помощью IDE SWI Prolog я освоил принципы
программирования с помощью предикатов, а также научился создавать,обрабатывать и
получать информацию из списков, реализованных в Прологе. Язык оказался очень
удобным для реализации сложных структур данных, так как программный код,
реализующий список, и операции над ним не занимают более 5 строк (в моем случае),
тогда как на языке C/C++ это заняло бы ~200 строк кода.
Логическое Программирование
Лабораторная работа №1: Обработка списков
Группа:
Студент:
Вариант задания:
9 декабря 2012 г.
8(О)-206(Б)
Дорофеев Артем
14
Документ
Категория
Программирование, Базы данных
Просмотров
5
Размер файла
50 Кб
Теги
лп1
1/--страниц
Пожаловаться на содержимое документа