Что такое findslide.org?

FindSlide.org - это сайт презентаций, докладов, шаблонов в формате PowerPoint.


Для правообладателей

Обратная связь

Email: Нажмите что бы посмотреть 

Яндекс.Метрика

Презентация на тему Рекурсивные структуры данных. Списки в Prolog. (Тема 7)

Содержание

Список как частный вид структурыОпределение. Под списком понимается упорядоченная последовательность однотипных элементов, которая может иметь произвольную длину. Признак упорядоченный указывает на то,что порядок элементов в последовательности является существенным и список [1,2,3] не эквивалентен списку [3,2,1].
Рекурсивные структуры данных    Списки в PrologРекурсивные структуры данных Список как частный вид структурыОпределение. Под списком понимается упорядоченная последовательность однотипных Способы представления списковФункторный, графический и скобочный	При использовании функторной формы записи голова Описание списков в Prolog	Графическая форма записи списка в виде «виноградной лозы» Применение списков в программе	Домен списка описывается в разделе domains, а работающий Правила сопоставления списков Сопоставление списков - конкретизация переменных Печать элементов спискаprint_list([]):- ! .print_list([Head|Tail]) :-write(Head), nl, print_list(Tail). print_list(Список)domains n=integer* predicates print_list(n)clausesgoal Определение длины спискаlength(Список, Количество)length([],0):-!.length([_|T],N) :- 	length(T,N1), 	N = N1+1.Предикат length не может Определение длины спискаlength(L,N) :- length(L,0,N).length([_|T],S,N) :- 	S1 = S+1, 	length(T,S1,N).length([],N,N).length(Список, Количество)	За счет Определение суммы элементов списка	 sum([X],X):-!.sum([X|T],S) :-	sum(T,S1),	S = S1+X.sum([],S,S):-!.sum([X|T],S,R) :-	S1=S+X,	sum(T,S1,R).	sum(Список, Сумма)domains n=integer* predicates Этапы решения задачи  «Нахождение суммы элементов списка»sum_lst([], 0):-!.sum_lst([Head|Tail], Sum) :-	sum_lst(Tail, Принадлежность элемента спискуmember(Элемент, Список)member(X,[X|_]).member(X,[_|T]) :- 	member(X,T).member используется не только для проверки, но member для генерации значенийmember(X,[X|_]).member(X,[_|T]) :- 	member(X,T).Goal member(X,[1, 2, 3]), write(X),nl,fail. Удаление элемента из спискаremove(Элемент, Список,Результат)remove(X,[X|T],T):- !.remove(X,[H|T],[H|R]):-	remove(X,T,R).Удаляется лишь одно вхождение элемента.Упражнение: построить предикат Конкатенация (объединение) списковappend(Список, Список, Результат)append([],L,L):- !.append([X|T],L,[X|R]):- 	append(T,L,R).	Постановка задачи. Требуется построить список –результат append для конкатенацииappend([],L,L):- !.append([X|T],L,[X|R]):- 	append(T,L,R). Обращение (реверсирование) спискаreverse(L,R) :- 	reverse(L,[],R).reverse([],R,R).reverse([X|T],L,R):- 	reverse(T,[X|L],R).domains n=integer* predicates reverse(n,n)reverse(n,n,n)goal reverse([1,2,3,4,5],Y),write(Y).reverse([],[]).reverse([X|T],L) :-	reverse(T,R),	append(R,[X],L).domains n=integer*
Слайды презентации

Слайд 2 Список как частный вид структуры

Определение. Под списком понимается

Список как частный вид структурыОпределение. Под списком понимается упорядоченная последовательность

упорядоченная последовательность однотипных элементов, которая может иметь произвольную длину.



Признак упорядоченный указывает на то,что порядок элементов в последовательности является существенным и список [1,2,3] не эквивалентен списку [3,2,1].

Элементами списка могут быть константы, переменные, структуры, последние могут включать в себя другие списки.

В Прологе списки -один из частных видов структур. Список -это либо пустой список, не содержащий ни одного элемента, либо структура, имеющая два компонента : голову и хвост. Конец списка представляется как хвост, который является пустым списком.

Слайд 3 Способы представления списков
Функторный, графический и скобочный

При использовании функторной

Способы представления списковФункторный, графический и скобочный	При использовании функторной формы записи

формы записи голова и хвост являются компонентами функтора, обозначаемого

точкой «.».
При использовании графической формы записи список представляется как специального вида дерево, «растущее» слева направо, причем ветви направлены вниз («виноградная гроздь»).
При использовании скобочной формы записи последовательность элементов списка, разделенных запятыми, заключается в квадратные скобки.

Слайд 4 Описание списков в Prolog

Графическая форма записи списка в

Описание списков в Prolog	Графическая форма записи списка в виде «виноградной

виде «виноградной лозы» удобна для записи списков на бумаге,

но в Пролог-программах не используется. Функторная форма записи оказывается неудобной для записи сложных списков. В Прологе для записи списков используется скобочная форма записи.

Работа со списками основана на расщеплении на голову и хвост: [Head| Tail].

Примеры :
[1,2,3] -Head :1, Tail : [2,3] ; [ [1], [2] ] -Head : [1], Tail : [ [2] ].

[ 1 | [2]]. Здесь Head : 1, Tail : [2].

Слайд 5 Применение списков в программе

Домен списка описывается в разделе

Применение списков в программе	Домен списка описывается в разделе domains, а

domains, а работающий со списком предикат - в разделе

predicates. Сам список задается в программе либо в разделе clauses, либо в разделе goal.
Пример :
domains
s_list=symbol*
predicates
print_list(s_list)


Слайд 6 Правила сопоставления списков
Сопоставление списков - конкретизация переменных

Правила сопоставления списков Сопоставление списков - конкретизация переменных

Слайд 7 Печать элементов списка
print_list([]):- ! .
print_list([Head|Tail]) :-
write(Head), nl, print_list(Tail).

Печать элементов спискаprint_list([]):- ! .print_list([Head|Tail]) :-write(Head), nl, print_list(Tail). print_list(Список)domains n=integer* predicates


print_list(Список)
domains n=integer*
predicates print_list(n)

clauses
goal print_list([ 1, 2, 3, 4]).


Слайд 8 Определение длины списка
length(Список, Количество)
length([],0):-!.
length([_|T],N) :-
length(T,N1),
N =

Определение длины спискаlength(Список, Количество)length([],0):-!.length([_|T],N) :- 	length(T,N1), 	N = N1+1.Предикат length не

N1+1.
Предикат length не может использоваться для генерации списка переменных

заданной длины
Упражнение: создать предикат для генерации списка заданной длины.

domains n=symbol*
predicates
length(n, integer)
clauses

Goal length([a, b, c], N), write(N).


Слайд 9 Определение длины списка
length(L,N) :- length(L,0,N).

length([_|T],S,N) :-
S1 =

Определение длины спискаlength(L,N) :- length(L,0,N).length([_|T],S,N) :- 	S1 = S+1, 	length(T,S1,N).length([],N,N).length(Список, Количество)	За

S+1, length(T,S1,N).
length([],N,N).
length(Список, Количество)

За счет введения дополнительного аргумента (аккумулятора) удается

проводить все вычисления до рекурсивного вызова.

domains n=symbol*
predicates length(n, integer)
length(n,integer,integer)
clauses

Goal length([a, b, c], X), write(X).


Слайд 10 Определение суммы элементов списка
sum([X],X):-!.
sum([X|T],S) :-
sum(T,S1),
S = S1+X.

sum([],S,S):-!.
sum([X|T],S,R) :- S1=S+X,
sum(T,S1,R).

sum(Список,

Определение суммы элементов списка	 sum([X],X):-!.sum([X|T],S) :-	sum(T,S1),	S = S1+X.sum([],S,S):-!.sum([X|T],S,R) :-	S1=S+X,	sum(T,S1,R).	sum(Список, Сумма)domains n=integer*

Сумма)
domains n=integer*
predicates
sum(n, integer)
domains n=integer*
predicates
sum(n,

integer, integer)

Слайд 11 Этапы решения задачи «Нахождение суммы элементов списка»
sum_lst([], 0):-!.
sum_lst([Head|Tail],

Этапы решения задачи «Нахождение суммы элементов списка»sum_lst([], 0):-!.sum_lst([Head|Tail], Sum) :-	sum_lst(Tail,

Sum) :-
sum_lst(Tail, Sum1),
Sum = Head + Sum1.
Goal

sum_lst([1, 2, 3, 4], S), write(S).

Слайд 12 Принадлежность элемента списку
member(Элемент, Список)
member(X,[X|_]).
member(X,[_|T]) :- member(X,T).
member используется не

Принадлежность элемента спискуmember(Элемент, Список)member(X,[X|_]).member(X,[_|T]) :- 	member(X,T).member используется не только для проверки,

только для проверки, но и для генерации последовательности значений

Goal member(X,[1,2,3]), write(X), nl, fail.

Goal X=[1,2,3,4], member(7,X), write(yes);write(no).

Goal member(1,[]), write(yes);write(no).

domains n=integer*
predicates
member(integer,n)


Слайд 13 member для генерации значений
member(X,[X|_]).
member(X,[_|T]) :- member(X,T).
Goal member(X,[1, 2,

member для генерации значенийmember(X,[X|_]).member(X,[_|T]) :- 	member(X,T).Goal member(X,[1, 2, 3]), write(X),nl,fail.

3]), write(X),nl,fail.


Слайд 14 Удаление элемента из списка
remove(Элемент, Список,Результат)
remove(X,[X|T],T):- !.
remove(X,[H|T],[H|R]):-
remove(X,T,R).
Удаляется лишь одно

Удаление элемента из спискаremove(Элемент, Список,Результат)remove(X,[X|T],T):- !.remove(X,[H|T],[H|R]):-	remove(X,T,R).Удаляется лишь одно вхождение элемента.Упражнение: построить

вхождение элемента.
Упражнение: построить предикат remove, который в случае, если

элемента нет в списке, возвращает исходный список.
Упражнение: построить предикат remove_all удаления всех вхождений элемента из списка.

domains n=integer*
predicates
remove(integer,n,n)

Goal remove(1,[2,1,4,7,1,1],R),write(R).


Слайд 15 Конкатенация (объединение) списков
append(Список, Список, Результат)
append([],L,L):- !.
append([X|T],L,[X|R]):- append(T,L,R).
Постановка задачи.

Конкатенация (объединение) списковappend(Список, Список, Результат)append([],L,L):- !.append([X|T],L,[X|R]):- 	append(T,L,R).	Постановка задачи. Требуется построить список

Требуется построить список –результат присоединения одного списка к другому.
goal

append([1, 2],[3, 4],L),write(L).

goal Y=[3],append(X,Y,[1,2,3]),write(X),nl,write(Y).


Слайд 16 append для конкатенации
append([],L,L):- !.
append([X|T],L,[X|R]):- append(T,L,R).

append для конкатенацииappend([],L,L):- !.append([X|T],L,[X|R]):- 	append(T,L,R).

  • Имя файла: rekursivnye-struktury-dannyh-spiski-v-prolog-tema-7.pptx
  • Количество просмотров: 119
  • Количество скачиваний: 0