- •Вопрос 1) Сравнительная характеристика декларативных и процедурных языков программирования
- •Вопрос 2) Предикаты. Предложения: факты и правила. (Prolog)
- •Вопрос 3) Переменные. Анонимные переменные. Конкретизация переменных Prolog
- •Унификация составных объектов
- •Использование знака равенства для унификации составных объектов
- •Унификация.
- •Сравнение термов.
- •Вопрос 4) Сопоставление и унификация. Предикат равенства. (Prolog)
- •Вопрос 5) Основные секции программы Prolog
- •Вопрос 6) Основные стандартные домены (Prolog)
- •Вопрос 7) Основные принципы поиска с возвратом. (Prolog)
- •Вопрос 8) Управление поиском решений(Prolog)
- •Вопрос 9) Простые и составные объекты данных
- •Унификация составных объектов
- •Использование знака равенства для унификации составных объектов
- •Использование нескольких значений как единого целого
- •Пример использования составных объектов
- •Вопрос 10) Аргументы множественных доменов. (Prolog )
- •Аргументы множественных типов
- •Вопрос 11) Рекурсия (Prolog)
- •Cхема вычисления факториала с помощью нисходящей стратегии рекурсии
- •12. Списки: объявление и примеры работы. (Prolog)
- •13. Строки. Работа со строками. (Prolog)
- •Вопрос 14) Метод отката после неудачи Prolog
- •Вопрос 15) Основы языка lisp. Символьные выражения: атомы и списки. (Lisp)
- •Вопрос 16) Базовые функции и предикаты. (Lisp)
- •Вопрос 17) Функции, определение функций.
- •Вопрос 18) простая рекурсия. (Lisp)
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]).
