- •Вопрос 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)
Вопрос 6) Основные стандартные домены (Prolog)
Раздел domain в прологе предназначен для объявления синонима к уже существующим типам или создания собственного составного типа. Вот все стандартные типа в пролог:
Char, любой снак в одинарных кавычках (‘A’,’*’, также можно использовать и цифровое значение в ASCII ‘\n’ (символ новой строки)).
String, последовательность char символов. Можно также использовать и цифровое знрачение ASCII, “\n Привет !!”.
Symbol, сюда входят все буквы, цифры и подчеркивание. При использовании этого домена вся строка хранится в ОП в виде таблице символов, что обеспечивает более быстрый поиск, но затрачивается больше времени ни создание данной таблице.
Integer, целое число рамером в 2 байта, диапозон [-32768,+32767]
Real, действительеное (вещественное) чилсо рамером в 8 байт, диапозон [1е-307,1е+308]
Пример объявления синонима:
Domain
Name=string;
Predicates
Nondeterm People(name)
Clauses
People(“Вася”).
People(“Петя”).
Goal
People(X).
Пример состовного типа:
Domains
Month,name = string
Day = integer
Year = integer
d = date(day,month,year)
Predicaes
nondeterm People(name,date)
Clauses
People(“Вася”,Date(13,”Сентябрь”,1987)).
People(“Петя”,Date(10,”Январь”,1986)).
People(“Коля”,Date(28,”Февраль”,1987)).
Goal
People(X,date(_,”Февраль”,_)). // вернет X=Коля
Вопрос 7) Основные принципы поиска с возвратом. (Prolog)
На этом шаге мы рассмотрим поиск с возвратом.
Часто при решении реальной задачи мы придерживаемся определенного пути для ее логического завершения. Если полученный результат не дает искомого ответа, мы должны выбрать другой путь. Так, вам, возможно, приходилось играть в лабиринт. Один из верных способов найти конец лабиринта - это поворачивать налево на каждой развилке лабиринта до тех пор, пока вы не попадете в тупик. Тогда следует вернуться к последней развилке и попробовать свернуть вправо, после чего опять поворачивать налево на каждом встречающемся распутье. Путем методичного перебора всех возможных путей вы, в конце концов, найдете выход.
Пролог при поиске решения задачи использует именно такой метод проб и возвращений назад; этот метод называется поиск с возвратом. Если, начиная поиск решения задачи (или целевого утверждения), Пролог должен выбрать между альтернативными путями, то он ставит маркер у места ветвления (называемого точкой отката) и выбирает первую подцель, которую и станет проверять. Если данная подцель не выполнится (что эквивалентно достижению тупика в лабиринте), Пролог вернется к точке отката и попробует проверить другую подцель.
Рассмотрим простой пример pro29_1.pro.
predicates
likes(symbol,symbol)
tastes(symbol,symboI)
food(symbol)
clauses
likes (bill,X):-
food(X),
tastes(X,good).
tastes(pizza,good).
tastes(brussels_sprouts,bad).
food(brussels_sprouts).
food(pizza).
Текст этой программы можно взять здесь.
Эта маленькая программа составлена из двух множеств фактов и одного правила. Правило, представленное отношением likes, утверждает, что Билл любит вкусную пищу.
Чтобы увидеть, как работает поиск с возвратом, дадим программе для решения следующее целевое утверждение:
likes(bill,What).
Замечание. Когда Пролог пытается произвести согласование целевого утверждения, он начинает поиск с вершины программы.
В данном случае Пролог будет искать решение, производя с вершины программы поиск соответствия с подцелью
likes (bill,What).
Он обнаруживает соответствие с первым предложением в программе и переменная what унифицируется с переменной X. Сопоставление с заголовком правила заставляет Пролог попытаться удовлетворить это правило. Производя это, он двигается по телу правила и обращается к первой находящейся здесь подцели: food(X).
Замечание. Если выполняется новое обращение, поиск соответствия для этого обращения вновь начинается с вершины программы.
Пытаясь согласовать первую подцель, Пролог (начиная с вершины) производит сопоставление с каждым фактом или заголовком правила, встреченным в программе.
Он обнаруживает соответствие с запросом у первого же факта, представляющего отношение food. Таким образом, переменная X связывается со значением brussels_sprouts. Поскольку существует более чем один возможный ответ на обращение food(X), Пролог ставит точку возврата (маркер) возле факта food(brussels_sprouts). Эта точка поиска с возвратом указывает на то место, откуда Пролог начнет поиск следующего возможного соответствия для food(X).
Замечание. Когда установление соответствия обращения завершается успешно, говорят, что обращение возвращается, и может быть испытана очередная подцель.
Поскольку переменная X связана с brussels_sprouts, следующее обращение будет выполняться так:
tastes: (brussels_sprouts,good)
и Пролог вновь начнет поиск с вершины программы, пытаясь согласовать это обращение. Поскольку соответствующих предложений не обнаруживается, обращение завершается неудачно, и теперь Пролог запускает механизм возврата. Начиная поиск с возвратом, Пролог отступает к последней позиции, где была поставлена точка отката. В данном случае Пролог возвращается к факту food(brussels_sprouts).
Замечание. Единственным способом освободить переменную, однажды связанную в предложении, является откат при поиске с возвратом.
Когда Пролог отступает к точке поиска с возвратом, он освобождает все переменные, связанные после этой точки, и будет искать другое решение для исходного обращения.
Обращение было food(X), так что связанность brussels_sprouts с X отменена. Теперь Пролог пытается заново произвести решение для этого обращения. Он обнаруживает соответствие с фактом food (pizza); на этот раз переменная X связывается со значением pizza.
Пролог переходит к следующей подцели в правиле, имея при этом новую связанную переменную. Производится новое обращение, tastes (pizza, good), и начинается поиск (опять от вершины программы). На этот раз соответствие найдено, и целевое утверждение успешно выполняется. Поскольку переменная What в целевом утверждении унифицирована с переменной X в правиле likes, а переменная X связана со значением pizza, переменная What отныне связана со значением pizza и Пролог сообщает решение:
What=pizza
На следующем шаге мы рассмотрим управление поиском решений.