Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Арифметические действия в прологе. ⇐ ПредыдущаяСтр 3 из 3
Отметим некоторые особенности стандарта языка при использовании арифметических действий. 1) для того, чтобы действительно вызвать какое-либо арифметическое действие, необходимо использовать оператор is. 2) Во-вторых, перед использованием переменных в арифметических действиях, они должны быть конкретизированы значениями. 3) В-третьих, лексический диапазон переменной – то предложение, в котором она присутствует. Если в программе присутствуют в разных предложениях переменные с одинаковыми именами, то это разные объекты. Отметим ту особенность, что символ равенства (=) здесь не обозначает операцию присваивания, как в алгоритмических языках программирования. Это операция сопоставления объектов и в случае, если она завершается успехом, переменные конкретизируются соответствующими значениями. Операции над числовыми величинами: + сложение - вычитание * умножение / вещественное деление ** степень числа (экспонента) // целочисленное деление mod деление по модулю rem остаток от целочисленного деления abs абсолютное значение числа sign знак числа random случайное число, не превышающее значения аргумента. Для вещественных чисел в Strawberry Prolog определены следующие функции: sin, cos, tg, arcsin, arccos, arctg, sinh, cosh, tgh, sqrt, log, log10, exp. Их названия и функциональные действия совпадают с известными функциями алгоритмических языков программирования. При работе с числовой информацией очень часто используются операции сравнения. X > Y X больше Y X < Y X меньше Y X > = Y X больше или равен Y X =< Y X меньше или равен Y X =: =Y величины X и Y совпадают (равны) X =\= Y величины X и Y не равны Следует отметить разницу между операторами = и =: =, первая вызовет сопоставление объектов и если они сопоставимы, приведет к конкретизации. Никаких вычислений при этом производиться не будет. Вместе с тем, вторая операция (=: =) вызовет арифметические действия, а конкретизации переменных производиться, не будет.
Работа с базами данных. Пролог программа представляется реляционной БД, то есть как описание некоторого множества отношений. Описание отношений в ней присутствует в явном виде (факты) или в неявном виде (правила). Более того, встроенные предикаты дают возможность корректировать эту БД в процессе выполнения программы. Предикаты для работы с БД таковы: assert, asserta, assertz, assert_in, asserta_in, retract, retractall. Предикат assert(< the fact> ) – всегда успешен, а в качестве своего побочного эффекта добавляет факт к текущей базе данных. Предикат retract(< the fact> ) – приводит к противоположному эффекту: удаляет сопоставимый c < the fact> факт из базы данных. Следует отметить, что добавленный факт будет присутствовать в текущей БД до конца текущего сеанса работы. Однако он будет «не видимым» для пользователя, т. е. не будет отображаться в рабочем окне. Для того чтобы факт появился в рабочем окне, необходимо использовать предикат assert_in. К этой же группе предикатов относятся родственные предикаты asserta и assertz (последний в SP отсутствует). Предикат asserta добавляет предложение в начало БД, а assertz – в конец (аналогия assert). Следует отметить, что из рабочего окна удаляемый факт не исчезнет. Для его «видимого» исчезновения необходимо использовать предикат retract_in. Для удаления всех вхождений данного факта в БД необходимо использовать предикат retractall(< the fact> ). Польза от таких предикатов очевидна, пользователь может динамически изменять БД в момент выполнения программы. Очевиден и тот факт, что неумелое, неграмотное их использование приведет к полному изменению исходной БД и как результат – непредсказуемые результаты. В отдельных случаях следует вовсе отказаться от использования предикатов этой группы. Интерфейс с программой осуществляется посредством предиката read(Term) или read(Term, String), первый аргумент которого – вводимый терм, т. е. переводимое слово, а второй (если он имеется) – надпись на заголовке диалогового окна.
Пролог и искусственный интелект. Экспертные системы. Пример применения Пролога в области искусственного интеллекта - экспертная система. Функции ЭС: 1) Диалог с пользователем, интерфейс 2) Выбор из базы знаний Экспертными системами обычно называют программы, которые могут заменить эксперта в какой-то предметной области. Мы построим классификационную экспертную систему, которая будет пытаться угадать загаданное человеком животное. Если загаданное человеком животное окажется неизвестно нашей программе, у нее будет возможность пополнить свою базу знаний новой информацией. пределим два предиката внутренней базы данных, которые позволят нам хранить информацию о животных. Один из них предназначен для хранения характеристик животных и будет иметь два аргумента: первый — номер свойства, второй — его словесное описание. Небольшой базовый набор свойств может выглядеть, например, так: cond(1, " кормит детенышей молоком" ). cond(2, " имеет перья" ). cond(3, " плавает" ). cond(4, " ест мясо" ). cond(5, " имеет копыта" ). cond(6, " летает" ). cond(7, " откладывает яйца" ). cond(8, " имеет шерсть" ). cond(9, " имеет полосы" ). cond(10, " имеет пятна" ). cond(11, " имеет черно-белую окраску" ). cond(12, " имеет длинную шею" ). cond(13, " имеет длинные ноги" ). cond(14, " имеет щупальца" ). Второй предикат будет хранить описание животных. Первый его аргумент — название животного, второй — список, элементами которого являются номера свойств, присущих данному животному. Выглядеть эта база знаний может примерно следующим образом: rule(" гепард", [1, 4, 8, 10]). rule(" тигр", [1, 4, 8, 9]). rule(" жираф", [1, 5, 8, 10, 12, 13]). rule(" зебра", [1, 5, 8, 9, 11]). rule(" страус", [2, 14]). rule(" пингвин", [2, 3, 11]). rule(" орел", [2, 6]). rule(" кит", [1, 3, 11]). cond_is(N, '1') /* если загаданное животное имеет свойство с номером N */ cond_is(N, '2') /* если загаданное животное не имеет свойства с номером N */ Процесс отгадывания задуманного животного будет проходить следующим образом. animals: – rule(X, L), check(L), nl, write(" Я думаю это ", X), nl, write(" Я прав? (1 — да, 2 — нет)" ), read_true_char(C), C='1',!. animals: – nl, write(" Я не знаю, что это за животное" ), nl, nl, write(" Давайте добавим его в мою базу знаний." ), nl, update. update: – nl, write(" Введите название животного: " ), readln(S), add_cond(L), /* указываем свойства животного */ assert(rule(S, L), knowledge), /* добавляем информацию в базу знаний*/ save(" animals.ddb", knowledge).
Популярное:
|
Последнее изменение этой страницы: 2017-03-08; Просмотров: 1050; Нарушение авторского права страницы