Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ФЛП.doc
Скачиваний:
17
Добавлен:
24.09.2019
Размер:
478.72 Кб
Скачать

Cхема вычисления факториала с помощью нисходящей стратегии рекурсии

Другой метод вычисления факториала - по восходящей стратегии рекурсии. Схема вычисления факториала по восходящей стратегии представлена на рисунке слева.

На Прологе программа вычисления факториала по восходящей стратегии рекурсии будет выглядеть так:

predicates

fact(integer,integer)

f(integer,integer,integer,integer)

clauses

fact(N,F):-f(N,F,0,1).

f(N,F,N,F):-!. % граничное условие

f(N,F,N1,F1):-N11=N1+1,

F11=F1*N11,

f(N,F,N11,F11).

Goal: fact(4,X).

12. Списки: объявление и примеры работы. (Prolog)

В императивных языках, как правило, основной структурой данных являются массивы. В Прологе так же, как и в Лиспе, основным составным типом данных является список.

В Прологе список (list) является объектом, содержащим внутри произвольное число других объектов. Списки соответствуют, грубо говоря, массивам в других языках, но, в отличие от массивов, список не требует декларирования его размера до начала его использования.

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

Элементами списка могут быть любые термы:

- константы

- переменные

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

Списки широко используются при создании баз данных и знаний, экспертных систем, карт городов, программ на ЭВМ и математических объектов (графы, формулы, функции).

Список, не содержащий элементов, называется пустым списком (записывается в квадратных скобках [ ]).

Пролог позволяет выполнять со списком целый ряд операций:

- доступ к объектам списка;

- проверка на принадлежность к списку;

- разделение списка на два;

- слияние двух списков;

- сортировку элементов списка в порядке возрастания или убывания.

Список - набор объектов одного и того же доменного типа.

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

В списках важен порядок расположения элементов: списки [1, 2, 3, 4] и [1, 3, 4, 2] являются различными.

Примеры списков

[monday, tuesday, wednesday, thursday, friday, saturday, sunday] — список, элементами которого являются дней недели;

[1, 2, 3, 4, 5, 6, 7] — список, элементами которого являются номера дней недели;

['п', 'в', 'с', 'ч', 'п', 'с', 'в'] — список, элементами которого являются первые символы русских названий дней недели;

Количество элементов в списке называется его длиной.

Длина списка [1, 2, 3, 4, 5, 6, 7] равна 7.

Список может содержать всего один элемент и даже не содержать элементов вовсе:

["Summer"]; [ ]

Дадим рекурсивное определение списка.

Список — это структура данных, определяемая следующим образом:

1) пустой список ([ ]) является списком;

2) структура вида [H|T] является списком, если H — первый элемент списка (или несколько первых элементов списка, перечисленных через запятую), а T — список, состоящий из оставшихся элементов исходного списка.

Принято называть H головой списка, а T — хвостом списка.

Фактически операция "|" позволяет разделить список на хвост и голову.

Данное определение позволяет организовывать рекурсивную обработку списков, разделяя непустой список на голову и хвост. Хвост, в свою очередь, также является списком, содержащим меньшее количество элементов, чем исходный список. Если хвост не пуст, его также можно разбить на голову и хвост. И так до тех пор, пока мы не доберемся до пустого списка, у которого нет головы.

Например, в списке [1, 2, 3] элемент 1 является головой, а список [2, 3] — хвостом, т.е. [1, 2, 3] = [1|[2, 3]].

Заметим, что хвост этого списка [2, 3], в свою очередь, может быть представлен в виде головы 2 и хвоста [3], а список [3] можно рассматривать в виде головы 3 и хвоста []. Пустой список далее не разделяется.

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

Элементы списка могут быть любыми, в том числе и составными объектами. В частности, элементы списка сами могут быть списками.

В разделе описания доменов списки описываются следующим образом:

DOMAINS

<имя спискового домена>=<имя домена элементов списка>*

<имя домена элементов списка> = <тип> или

<имя спискового домена>=<тип>*

Звездочка после имени домена указывает на то, что мы описываем список, состоящий из объектов соответствующего типа

Синтаксис списков:

domains /*раздел описания доменов*/

My_spisok = num_int*

num_int=integer

predicates /*раздел описания доменов*/

My_spisok(num_int)

clauses /*размещение фактов и правил*/

My_spisok([1,2,3,4,5]).

goal /**/

Организация запросов в списках

My_spisok (All).

My_spisok ([_,_,_,B,_]).

My_spisok ([B1,B2,_,_,_]).

Вывод элементов списка на печать

domains

list_season=string*

predicates

print_list(list_season)

clauses

print_list([]).

print_list([X|Y]):- write(X), nl, print_list(Y).

goal

print_list(L).

Компоновка данных в список

Компоновка данных в список – сбор данных из базы данных в список для последующей их обработки.

Встроенный предикат findall.

findall(Variable_name,Predicate_expression,List_name).

где Variable_name - объект входного предиката Predicate_expression,а List_name является именем переменной выходного списка. Переменная должна относиться к домену списков, объявленному в разделе domains.

Для выделения элемента из списка и сравнения его с объектом поиска можно применить метод разделения списка на голову и хвост.

Стратегия поиска при этом будет состоять в рекурсивном выделении головы списка и сравнении ее с элементом поиска.

Поиск элемента в списке

Поиск - просмотр списка на предмет выявления соответствия между элементом данных (объектом поиска) и элементом просматриваемого списка. Если такое соответствие найдено, то поиск заканчивается успехом. В противном случае поиск заканчивается неуспехом.

Для сопоставления объекта поиска с элементами просматриваемого списка необходим предикат, объектами которого являются объект поиска и список:

find_it(3 ,[1,2,3,4,5]).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]