- •Билет № 3
- •Методы представления знаний
- •Основные понятия Пролога – предложения: факты и правила
- •Создать предикат, вычисляющий по натуральному числу его факториал
- •Билет № 6
- •Семантические сети
- •Хвостовая рекурсия
- •Описать базу знаний о родственных отношениях
- •Билет № 9
- •Обобщенная структура экспертных систем
- •Создать предикат, позволяющий проверить принадлежность элемента списку
- •Билет № 12
- •Многослойный персептрон
- •Домены: стандартные, списковые, составные
- •Билет № 15
- •Проектирование и обучение персептронов
- •Отсечение и откат в Прологе
- •Написать предикат, вычисляющий среднее арифметическое элементов списка
Домены: стандартные, списковые, составные
Раздел описания доменов является аналогом раздела описания типов в обычных императивных языках программирования и начинается с ключевого слова DOMAINS.
В Турбо Прологе имеются стандартные домены, которые не нужно указывать в разделе описания доменов. Основные стандартные домены - это:
Integer - целое число (из промежутка -32768...32767);
real - действительное число (лежащее между ±1e-307...±1e308);
char - символ, заключенный в одиночные апострофы;
string - последовательность символов, заключенная в двойные кавычки;
symbol - символическая константа (начинающаяся со строчной буквы последовательность букв латинского алфавита, цифр и знаков подчеркивания или последовательность любых символов, заключенная в кавычки). Этот домен соответствует понятию атома, с которым мы познакомились во второй лекции;
file - файл (подробному изучению файлов будет посвящена лекция 12).
В разделе описания доменов объявляются любые нестандартные домены, используемые в качестве аргументов предикатов.
Объявление домена имеет следующий вид:
<имя домена>=<определение домена>
или
file=<имя файлового домена1>;...;<имя файлового доменаN>
Удобно использовать описание доменов для сокращения имен стандартных доменов. Например, чтобы не писать каждый раз integer, можно написать следующее:
DOMAINS
i=integer
и далее использовать вместо ключевого слова integer односимвольное обозначение i.
Из доменов можно конструировать составные или структурные домены ( структуры ). Структура описывается следующим образом:
<имя структуры>=<имя функтора>(<имя домена первой
компоненты>,...,<имя домена последней компоненты>)
[;<имя функтора>(...)]*
Каждая компонента структуры в свою очередь может быть структурой. Например, структура, описывающая точку на плоскости и имеющая две компоненты (координаты точки)
point = p(integer, integer)
может входить в качестве компоненты в более сложную структуру, описывающую треугольник:
triangle = tr(point, point, point)
В описание структуры могут входить альтернативы, разделенные символом " ; " или ключевым словом " or ".
Так, структуру, описывающую точку и на плоскости, и в пространстве, можно задать следующим образом:
point = p(integer, integer);p(integer, integer, integer).
Описание файлового домена имеет вид:
file = <символическое имя файла 1>;...;
<символическое имя файла N>
Для представления данных в Турбо Прологе, в отличие от стандартных алгоритмических языков программирования, используются не массивы, а списки. Подробнее списки будут рассмотрены в следующей лекции, а пока заметим, что списковый домен задается следующим образом:
<имя спискового домена>=<имя домена элементов списка>*
Например, список целых чисел описывается так:
list_of_integer=integer*
Разработать предикат, проверяющий, является ли список палиндромом. Палиндромом называется список, который совпадает со своим обращением.
Палиндромом называется список, который совпадает со своим обращением. Соответственно, у данного предиката будет всего один аргумент (список, который проверяем на "палиндромность"). Первое, что приходит в голову: воспользоваться только что написанным предикатом reverse (или reverse2). Перевернуть список и проверить, совпадает ли результат с исходным списком. Выглядеть этот предикат будет следующим образом: palindrom(L):– reverse (L,L).
rev([H|T],L1,L2):-rev(T,[H|L1],L2). rev([ ],L,L). palindrom(L):-rev(L,L).
