Добрый день! В курсе "Проектирование систем искусственного интеллекта" начал проходить обучение и сдал тесты по лекциям 1,2,3,4. Но видимо из-за того что не записался на курс, после того как записался на курс у меня затерлись результаты сданных тестов. Можно как-то исправить (восстановить результаты по тестам 1,2,3,4) ? |
Язык программирования Пролог
Унификация
Одним из наиболее важных аспектов программирования на Прологе являются понятия унификации (отождествления) и конкретизации переменных.
Пролог пытается отождествить термы при доказательстве, или согласовании, целевого утверждения. Например, в программе из "Базовые понятия" для согласования запроса ?- собака(Х) целевое утверждение собака (X) было отождествлено с фактом собака (Рекс), в результате чего переменная Х стала конкретизированной: Х= рекc.
Переменные, входящие в утверждения, отождествляются особым образом — сопоставляются. Факт доказывается для всех значений переменной (переменных). Правило доказывается для всех значений переменных в головном целевом утверждении при условии, что хвостовые целевые утверждения доказаны. Предполагается, что переменные в фактах и головных целевых утверждениях связаны квантором всеобщности. Переменные принимают конкретные значения на время доказательства целевого утверждения.
В том случае, когда переменные содержатся только в хвостовых целевых утверждениях, правило считается доказанным, если хвостовое целевое утверждение истинно для одного или более значений переменных. Переменные, содержащиеся только в хвостовых целевых утверждениях, связаны квантором существования. Таким образом, они принимают конкретные значения на то время, когда целевое утверждение, в котором переменные были согласованы, остается доказанным.
Терм Х сопоставляется с термом Y по следующим правилам. Если Х и Y — константы, то они сопоставимы, только если они одинаковы. Если Х является константой или структурой, а Y — неконкретизированной переменной, то Х и Y сопоставимы и Y принимает значение Х (и наоборот). Если Х и Y — структуры, то они сопоставимы тогда и только тогда, когда у них одни и те же главный функтор и арность и каждая из их соответствующих компонент сопоставима. Если Х и Y — неконкретизированные (свободные) переменные, то они сопоставимы, в этом случае говорят, что они сцеплены. В (Таблица 7.1) приведены примеры отождествимых и неотождествимых термов.
Терм1 | Терм2 | Отождествимы ? |
---|---|---|
джек(Х) | джек (человек) | да: Х=человек |
джек (личность) | джек (человек) | нет |
джек(Х,Х) | джек(23,23) | да: Х=23 |
джек(Х.Х) | джек (12,23) | нет |
джек( . ) | джек(12,23) | да |
f(Y,Z) | Х | да: X=f(Y,Z) |
Х | Z | да: X=Z |
Заметим, что Пролог находит наиболее общий унификатор термов. В последнем примере (табл.7.1) существует бесконечное число унификаторов:
X-1, Z-2; X-2, Z-2; ....
но Пролог находит наиболее общий: Х=Z.
Следует сказать, что в большинстве реализаций Пролога для повышения эффективности его работы допускается существование циклических унификаторов. Например, попытка отождествить термы f(X) и Х приведет к циклическому унификатору X=f(X), который определяет бесконечный терм f(f(f(f(f(...))))). В программе это иногда вызывает бесконечный цикл.
Возможность отождествления двух термов проверяется с помощью оператора =.
Ответом на запрос
?- 3+2=5.
будет
нет
так как термы не отождествимы (оператор не вычисляет значения своих аргументов), но попытка доказать
?-строка(поз(Х)) -строка(поз(23)).
закончится успехом при
Х=23.
Унификация часто используется для доступа к подкомпонентам термов. Так, в вышеприведенном примере Х конкретизируется первой компонентой терма поз(23), который в свою очередь является компонентой терма строка.
Бывают случаи, когда надо проверить, идентичны ли два терма. Выполнение оператора = = заканчивается успехом, если его аргументы — идентичные термы. Следовательно, запрос
?-строка(поз(Х)) --строка (поз (23)).
дает ответ
нет
поскольку подтерм Х в левой части ( X — свободная переменная) не идентичен подтерму 23 в правой части, Однако запрос
?- строка (поз (23)) --строка (поз (23)).
дает ответ
да
Отрицания операторов = и - = записываются как \= и \= = соответственно.
Арифметические выражения
В этой лекции показано, каким образом Пролог выполняет арифметические операции. Будут описаны арифметические операторы и их использование в выражениях, а также рассмотрены встроенные предикаты, служащие для вычисления и сравнения арифметических выражений.
Введение
Язык Пролог не предназначен для программирования задач с большим количеством арифметических операций. Для этого используются процедурные языки программирования. Однако в любую Пролог-систему включаются все обычные арифметические операторы:
+ сложение — вычитание * умножение / деление mod остаток от деления целых чисел div целочисленное деление
В некоторых реализациях языка Пролог присутствует более широкий набор встроенных арифметических операторов.
Диапазоны чисел, входящих в арифметические выражения, зависят от реализации Пролога. Например, система ICLPROLOG оперирует целыми числами со знаком в диапазоне
–8388606 ... 8388607
Арифметические выражения
Арифметическое выражение является числом или структурой. В структуру может входить одна или более компонент, таких, как числа, арифметические операторы, арифметические списковые выражения, переменная, конкретизированная арифметическим выражением, унарные функторы, функторы преобразования и арифметические функторы.
Числа. Числа и их диапазоны определяются в конкретной реализации Пролога.
Арифметические операторы. + - * / mod div
Арифметические списковые выражения. Если Х — арифметическое выражение, то список [X ] также является арифметическим выражением, например [1,2,3]. Первый элемент списка используется как операнд в выражении. Скажем, X is ([l,2,3]+5) имеет значение 6.
Арифметические списковые выражения полезны и при обработке символов, поскольку последние могут рассматриваться как небольшие целые числа. Например, символ "а" эквивалентен [97 ] и, будучи использован в выражении, вычисляется как 97. Поэтому значение выражения "р"+"А"-"а" равно 80, что соответствует коду ASCII для "Р".
Переменная, конкретизированная арифметическим выражением. Примеры: Х-5+2 и У-3*(2+А)
Унарные функторы. Примеры: +(Х) и -(У)
Функторы преобразования. В некоторых реализациях Пролога имеется арифметика с плавающей точкой, а следовательно, и функторы преобразования. Например:
float (X) преобразует целое число Х в число с плавающей точкой.
Математические функторы. Пример: квадрат( Х ) объявлен как оператор и эквивалентен арифметическому выражению ( Х*Х ).
Арифметические операторы
Атомы +, -, *, /, mod и div — обычные атомы Пролога и могут использоваться почти в любом контексте. Указанные атомы — не встроенные предикаты, а функторы, имеющие силу только в пределах арифметических выражений. Они определены как инфиксные операторы. Эти атомы являются главными функторами в структуре, а сама структура может принимать только описанные выше формы.
Арифметический оператор выполняется следующим образом. Во-первых, вычисляются арифметические выражения по обе стороны оператора. Во-вторых, над результатом вычислений выполняется нужная операция.
Арифметические операторы определяются Пролог-системой. Если мы напишем предикат
среднее (X,Y,Z) :- Z is (X+Y)/2.
то, хотя можно определить среднее как оператор,
?- ор(250^х, среднее).
но Пролог выдаст сообщение об ошибке, если встретит выражение Z is X среднее Y.
Это произойдет потому, что Х среднее Y не образует арифметического выражения, а среднее не является арифметическим оператором, определенным в системе.
Вычисление арифметических выражений
В Прологе не допускаются присваивания вида Сумма=2+4.
Выражение такого типа вычисляется только с помощью системного предиката is, например:
Сумма is 2 + 4.
Предикат is определен как инфиксный оператор. Его левый аргумент — или число, или неконкретизированная переменная, а правый аргумент — арифметическое выражение.
Попытка доказательства целевого утверждения Х is Y заканчивается успехом в одном из следующих случаев:
- Х — неконкретизированная переменная, а результат вычисления выражения Y есть число;
- Х — число, которое равно результату вычисления выражения Y. Цель Х is Y не имеет побочных эффектов и не может быть согласована вновь. Если Х не является неконкретизированной переменной или числом либо если Y — не арифметическое выражение, возникает ошибка.
Примеры:
D is 10- 5 заканчивается успехом и D становится равным 5 4 is 2 * 4 - 4 заканчивается успехом 2 * 4 - 4 is 4 заканчивается неудачей a is 3 + 3 заканчивается неудачей X is 4 + а заканчивается неудачей 2 is 4 - X заканчивается неудачей
Обратите внимание, что предикат is требует, чтобы его первый аргумент был числом или неконкретизированной переменной. Поэтому М - 2 is 3 записано неверно. Предикат is не является встроенным решателем уравнений.
Сравнение результатов арифметических выражений
Системные предикаты =:=, =\=, >, <, >= и <= определены как инфиксные операторы и применяются для сравнения результатов двух арифметических выражений.
Для предиката @ доказательство целевого утверждения X@Y заканчивается успехом, если результаты вычисления арифметических выражений Х и Y находятся в таком отношении друг к другу, которое задается предикатом @.
Такое целевое утверждение не имеет побочных эффектов и не может быть согласовано вновь. Если Х или Y — не арифметические выражения, возникает ошибка.
С помощью предикатов описываются следующие отношения:
Х =:= Y - Х равно Y
Х =\= Y - Х не равно Y
Х < Y - Х меньше Y
Х > Y - Х больше Y
Х <= Y - Х меньше или равно Y
Х >= Y - Х больше или равно Y
Использование предикатов иллюстрируют такие примеры:
а > 5 - заканчивается неудачей
5+2+7 > 5+2 - заканчивается успехом
3+2 =:= 5 - заканчивается успехом
3+2 < 5 - заканчивается неудачей
2 + 1 =\= 1 - заканчивается успехом
N > 3 - заканчивается успехом, если N больше 3, и неудачей в противном случае