Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Арифметические действия в прологе.



Отметим некоторые особенности стандарта языка при использовании арифметических действий.

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; Просмотров: 998; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.022 с.)
Главная | Случайная страница | Обратная связь