Интерфейс clips. Вычисление математических выражений в режиме командной строки — КиберПедия 

Двойное оплодотворение у цветковых растений: Оплодотворение - это процесс слияния мужской и женской половых клеток с образованием зиготы...

Поперечные профили набережных и береговой полосы: На городских территориях берегоукрепление проектируют с учетом технических и экономических требований, но особое значение придают эстетическим...

Интерфейс clips. Вычисление математических выражений в режиме командной строки

2017-12-21 2859
Интерфейс clips. Вычисление математических выражений в режиме командной строки 4.75 из 5.00 4 оценки
Заказать работу

ОГЛАВЛЕНИЕ

 

Введение……………………………………………………………………4

1. Интерфейс CLIPS. Вычисление математических выражений в режиме командной строки……………………………...………………….5

2. Факты в CLIPS. Упорядоченные факты…………………….………….9

3. Неупорядоченные факты. Сохранение и загрузка фактов…………..15

4. Правила. Использование условных элементов в записи правил…………………………………………………………..………….20

5. Процедурные функции…………………………………………………24

6. Функции пользователя…………………………………………………28

7. Обработка строковых величин………………………………….……..31

Литература…………………………………………………….……..........35


 

ВВЕДЕНИЕ

 

Предлагаемое методическое пособие представляет собой описание лабораторных работ по курсу «Интеллектуальные информационные системы» и предназначено для студентов, обучающихся по специальности «прикладная информатика в экономике».

Основная цель пособия – помощь студентам в подготовке к выполнению лабораторных работ по изучению языка программирования CLIPS, ориентированного на разработку экспертных систем.

Целью выполнения данных лабораторных работ является приобретение и усвоение студентами навыков работы в среде CLIPS (формальная постановка задачи, преобразование в форму, пригодную для программирования на CLIPS, оценка результатов) а также закрепление теоретических знаний, полученных при прослушивании курса лекций «Интеллектуальные информационные системы».

Среда CLIPS представляет собой современный инструмент, предназначенный для создания экспертных систем. В настоящее время CLIPS находится в открытом доступе. Официальный сайт CLIPS располагается по адресу: http://www.ghg.net/clips/CLIPS.html.

В данном пособии рассматриваются основные понятия и необходимые сведения по программированию на языке искусственного интеллекта CLIPS.

Пособие содержит необходимый теоретический материал, примеры решения задач и задания для самостоятельной работы.

К каждому разделу приводятся несколько типовых задач с решениями, что позволяет студентам самостоятельно подготовиться к выполнению лабораторной работы.

В качестве результата выполнения лабораторной работы студентом должен быть подготовлен отчет о проделанной работе, который включает:

1. Постановку задачи

2. Входные/Выходные данные (при необходимости)

3. Текст программы на языке CLIPS (с необходимыми комментариями)

4. Результаты тестирования (наборы входных и выходных данных).

В настоящем пособии приводится список литературы, которая может быть использована для организации самостоятельной работы студентов.


ИНТЕРФЕЙС CLIPS. ВЫЧИСЛЕНИЕ МАТЕМАТИЧЕСКИХ ВЫРАЖЕНИЙ В РЕЖИМЕ КОМАНДНОЙ СТРОКИ

 

Основные сведения

Среда CLIPS (C Language Integrated Production System) предназначена для построения экспертных систем (ЭС). Язык был разработан в Центре космических исследований NASA (NASA's Johnson Space Center) в середине 1980-х годов и во многом сходен с языками, созданными на базе LISP и OPS5. Сейчас CLIPS и документация на этот инструмент свободно распространяется через интернет.

CLIPS поддерживает три основных способа представления знаний:

● продукционные правила для представления эвристических, основанных на опыте знаний;

● функции для представления процедурных знаний;

● объектно-ориентированное программирование.

Среда загружается запуском файла clipswin.exe.

Рис.1. Окно среды CLIPS

В окне отображается стандартная строка приглашения CLIPS, куда и вводятся команды.

Назначение основных пунктов меню оконного интерфейса, используемых при выполнении данного цикла лабораторных работ представлены в табл. 1.

Таблица 1 Основные команды главного меню CLIPS

Пункт Подпункт “Горячие” клавиши Назначение команды
File New Open Load … Load Batch Ctrl+N Ctrl+O Ctrl+L Создание нового файла Открытие файла Загрузка конструкций из файла. Исполнение пакетного файла
Edit Cut Copy Paste Ctrl+X Ctrl+C Ctrl+V Вырезка фрагмента Копирование фрагмента Вставка строки из буфера обмена
Execution Reset Run Step Ctrl+U Ctrl+R Ctrl+T Инициализация конструкций Запуск на выполнение Выполнение одного шага вывода
Browse Module Defrule Manager Deffacts Manager   Отображает модуль Менеджер правил Менеджер фактов
Window Facts Window Agenda Window Clear dialog window   Активизация окна списка фактов Активизация окна агендыОчищает окно с командной строкой

CLIPS может работать в нескольких режимах:

1. интерактивно, с использованием простого текстового интерфейса командной строки;

2. интерактивно, с использованием GUI-интерфейса;

3. как ЭС, интегрированная в другие приложения.

В режиме интерпретатора пользователь может использовать множество команд. Основным методом взаимодействия пользователя с CLIPS является ввод команд с командной строки CLIPS. После появления на экране подсказки CLIPS> пользователь может ввести команду (рис.1).

Командами могут быть вызовы функций, конструкции, глобальные переменные или константы. Если ввести вызов функции, вычисляется значение этой функции и на экран выводится результат.

Вызовы функций в CLIPS имеют префиксную форму: аргументы функции могут стоять только после ее названия. Вызов функции начинается с открывающейся скобки, за которой следует имя функции, затем идут аргументы, каждый из которых отделен одним или несколькими пробелами. Аргументами функции могут быть данные простых типов, переменные или вызовы других функций. В конце вызова ставится закрывающаяся скобка. Например, выражение 3 + 8*9 + 4 в CLIPS записывается следующим образом:

(+ 3 (* 8 9) 4)

Синтаксис языка CLIPS можно разбить на три основных группы элементов, предназначенных для написания программ:

– типы данных;

– функции, использующиеся для обработки данных;

– конструкторы, предназначенные для создания таких структур языка, как факты, правила, классы и т. д.

В CLIPS поддерживаются восемь простейших типов данных:

integer – целые числа (237, 15, +12, -32);

float – числа с плавающей запятой (237e3, 15.09, +12.0, -32.3e-7);

symbol – символьный тип (любая последовательность символов, начинающаяся с отображаемого ASCII-символа и продолжающаяся до ограничителя. Ограничителем является любой неотображаемый символ);

external-address – внешний адрес (значение этого типа может быть создано только посредством вызова внешней функции.);

fact-address – адрес факта (оперировать с фактом можно, используя его адрес, который представлен значением данного типа.);

instance-name – имя экземпляра (данный тип предназначен для хранения значения имени объекта, который представляет собой экземпляр определенного пользователем класса);

instance-address – адрес экземпляра (данный тип предназначен для хранения значения, представляющего адрес объекта).

Наиболее часто используемыми командами в CLIPS являются:

сlear –очистка рабочей памяти системы. Команда удаляет все определенные в системе на текущий момент конструкторы и ассоциированные с ними данные.

exit –завершение сеанса работы с CLIPS.

reset –перезагрузка рабочей памяти системы. Команда очищает текущий план решения задачи, удаляет все факты из списка фактов и объекты из списка объектов. При этом в систему добавляется предопределенный факт initial-fact, предопределенный объект initial-object и все факты, объекты и глобальные переменные, определенные пользователем с помощью конструкторов deffacts, definstances и defglobals.

В CLIPS предусмотрен ряд стандартных арифметических и математических функций

Таблица 2. Запись математических функций в CLIPS

Функция Обозначение функции в CLIPS
Сложение +
Вычитание -
Умножение *
Деление /
Возведение в степень * *
Определение абсолютного значения abs
Вычисление квадратного корня sqrt
Целочисленное деление div
Остаток от деления mod
Нахождение минимума min
Нахождение максимума мах
Синус sin
Косинус cos
Тангенс tan
Натуральный логарифм log
Экпонента ex exp
Округление числа round
Выбор целого случайного числа из интервала [n1, n2] Random n1 n2

 

 

Пример.

В режиме командной строки вычислить значения выражений:

а) (3+5)*2 б) max(32, 23) в)

 

Решение

1. Запустите Clips и в командной строке окна Dialog Window запишите выражения:

а)

 

Рис.2. Вычисление выражения (3+5)*2 в режиме командной строки

б)

 

 

Рис.3. Вычисление выражения max(32, 23) в режиме командной строки

в)

 

 

 

Рис.4. Вычисление выражения в режиме командной строки

 

 

Контрольные вопросы

1. Поясните назначение инструментальной среды Clips.

2. Какие способы представления знаний поддерживает Clips?

3. Какие режимы работы допустимы в среде Clips?

4. Каково назначение основных пунктов меню оконного интерфейса Clips?

5. Какая форма записи используется в CLIPS для выражений?

6. Перечислите основные типы данных в Clips.

7. Поясните назначение команд сlear, exit, reset.

Задания для самостоятельной работы

В режиме командной строки вычислить значения выражений:

a) (42 -5)*(3 + 4) b) 42 + 28/(5+2) c)
d) |3е3 – 2ln 34| e) max (23,32, 25) f) 33 – e5+sin 2
g) sin1 + 1/ (cos1 – 2) h) 2e4- 4 – |sin 62| i)

 

 

Пример.

Создать файл, содержащий три неупорядоченных факта вида (student (name <фамилия>) (gruppa <группа>) (date <дата рождения>)). Загрузить данные факты.

В факте с индексом 2 изменить значение слота date, факт f-1 продублировать, изменив фамилию. Сохранить полученный список фактов.

 

Решение.

Сначала необходимо создать файл, содержащий описание шаблона для неупорядоченных фактов вида (student (name <фамилия>) (gruppa <группа>) (date <дата рождения>)) с помощью конструктора deftemplate. Значения слота gruppa зададим по умолчанию – ПИЭ4-1.

Для этого создайте новый текстовый файл (File->New) и наберите текст:

 

5

Рис. 15 Описание шаблона для неупорядоченных фактов

 

Сохраните файл под именем lab2-1.clp.

 

Для создания списка фактов создайте еще один текстовый файл и запишите 3 факта:

Рис. 16 Список неупорядоченных фактов

 

Сохраните файл под именем lab2-1-facts.clp. Исходные файлы подготовлены.

Прежде чем загрузить список фактов, необходимо загрузить в систему шаблон, описанный в файле lab2-1.clp. Для этого загрузите данный файл с помощью команд главного меню File->Load… Если после выполнения команды выведено сообщение TRUE, можно приступить к загрузке фактов с помощью команды load-facts:

 

Рис. 17 Просмотр списка фактов после загрузки из текстового файла lab2-1-facts.clp

 

Для изменения в факте с индексом 2 значение слота date, наберите команду (modify 2 (date 12-02-1985)) и просмотрите полученный список с помощью команды (facts) (рис.18):

Рис. 18 Результат модификации факта f-2

 

Для дублирования факта с индексом 1, наберите команду

(duplicate 1 (name Sidorov)) и просмотрите полученный список с помощью команды (facts):

Рис. 19 Результат дублирования факта f-1

 

Сохраните новый список фактов:

Рис. 20 Сохранение списка фактов в текстовый файл lab2-1-facts.clp

 

Для проверки очистите текущий список фактов, загрузите файл lab2-1.clp и сохраненные в файле lab2-1-facts.clp факты. Просмотрите список фактов:

Рис. 21 Просмотр списка фактов после загрузки из текстового файла lab2-1-facts.clp

 

Контрольные вопросы

1. Какая конструкция используется для создания неупорядоченных (шаблонных) фактов? Поясните ее структуру.

2. Какая функция применяется для модификации неупорядоченного факта?

3. Какая функция используется для копирования неупорядоченного факта?

4. Какая функция используется для сохранения текущего списка фактов в текстовый файл?

5. С помощью какой функции можно загрузить факты из текстового файла?

Задания для самостоятельной работы

1. А) Создать файл, содержащий три неупорядоченных факта вида (client (name <фамилия>) (in <инд.номер>) (citi <город проживания>)). Значений слота citi задать по умолчанию. Загрузить данные факты. В факте с индексом 1 изменить значение слота citi, а в факте с индексом 2 изменить фамилию. Факт f-3 продублировать, изменив in. Сохранить полученный список фактов.

Б). Загрузить полученный список фактов. Добавить 2 новых неупорядоченных факта вида, используя функцию assert. Удалить факты с индексами 1, 3, Просмотреть полученный результат. Сохранить полученный список фактов в другой файл.

2. А) Создать файл, содержащий три неупорядоченных факта вида (sotrudnik (name <фамилия>) (otdel <отдел>) (st <стаж работы>)) Значений слота otdel задать по умолчанию. Загрузить данные факты. В факте с индексом 1 изменить значение слота otdel, а в факте с индексом 3 изменить стаж работы. Факт f-2 продублировать, изменив фамилию. Сохранить полученный список фактов.

Б) Загрузить полученный список фактов. Добавить 2 новых неупорядоченных факта вида, используя функцию assert. Удалить факты с индексами 2, 4. Просмотреть полученный результат. Сохранить полученный список фактов в другой файл.

 

ПРОЦЕДУРНЫЕ ФУНКЦИИ

 

Основные сведения

В CLIPS имеются функции, которые обеспечивают возможность процедурного программирования. Они могут использоваться для создания отрезков процедурного кода в правилах. Наиболее часто используются следующие процедурные функции:

1. (bind <имя-переменной><выражение>) - создание и связывание переменных

Первый аргумент функции <имя-переменной> является именем глобальной или локальной переменной, созданной в правиле или функции.

Если параметр <выражение> не определен, то выполнение функции bind не оказывает на локальные переменные никакого влияния, а глобальные переменные получают при этом значения по умолчанию.

Функция bind возвращает значение false при неудачном исходе операции. Во всех остальных случаях функция возвращает присвоенное переменной значение.

Если заданная переменная еще не определена, она будет создана и связана с соответствующим значением.

2. (if <выражение> then <действия1> [else<действия2>]) - ветвление

Если условие, заданное с помощью выражения, выполняется (т. е. не является ложным), выполняются действия, определенные в блоке then. В противном случае производятся действия из блока else. В каждом из таких блоков может быть задано любое количество действий. Любой блок может содержать вложенную конструкцию if...then...else. Блок else является необязательным.

3. (while <условие> do <действия>) - цикл с предусловием

Проверка условия выполняется перед выполнением тела цикла. Цикл выполняется, пока условие (логическое выражение) остается истинным. В теле цикла может содержаться произвольное количество действий, включая вложенные циклы или функцию if.

4. (loop-for-count <диапазон> do <действия>) - цикл с заданным числом повторений

Цикл loop-for-count производит указанные действия некоторое количество раз согласно заданному параметру <диапазон>. Если минимальное значение параметр не задано, ему автоматически присваивается 1. CLIPS предусматривает наличие параметра <переменная-цикла>, определяющего имя локальной переменной, которая может использоваться в теле цикла для определения текущего числа итераций. Использование переменной цикла после завершения работы функции loop-for-count вне тела цикла запрещено. Функции break и return могут быть использованы для экстренного прерывания работы цикла. В теле цикла может содержаться произвольное количество действий, включая вложенные циклы или функцию if.

5. (switch <выражение> (case<выражение> then <действие>) [(default <действие>)] - множественный выбор

Для эффективного применения функции switch необходимо наличие, по крайней мере, трех альтернативных групп действий, зависящих от заданного условного выражения.

Функция switch в первую очередь проводит вычисление аргумента <выражение>, а затем сравнивает его со всеми условиями ветвления по очереди. Если значение заданного выражения совпадает с одним из условий ветвления, выполняются соответствующие действия, и работа функции завершается. Если совпадений обнаружить не удалось, функция возвращает результат последнего сеанса выбора (если таковой имеется) или значение false.

6. (break) -прерывание

Функция break прерывает текущую итерацию циклов while и loop-for-count

7. (return [<выражение>]) - прерывает выполняющуюся функцию, цикл, правило, обработчик сообщения и т. д.

Если функция return вызывается без аргументов, функция не возвращает никакого значения. Однако если аргумент присутствует, return возвращает результат вычислений, который присваивается значению прерванной функции, цикла или обработчика сообщения.

 

Пример 1.

Создать правило perevod, которое запрашивает количество студентов, вводит данные о них и добавляет факты вида (pereveden <имя><курс>)

 

Решение:

1. Запустите Clips, откройте новый файл и наберите текст программы:

(defrule perevod

=>

(printout t "n=") % выводим строку подсказки

(bind?n (read)) % вводим количество студентов

(loop-for-count?n do % повторить n раз

(printout t "FIO:")

(bind?name (readline)) % вводимФИО

(printout t "kurs:")

(bind?k (read)) % вводимкурс

(while (or (<?k 2) (>?k 5))do % если курс задан неверно: меньше 2 или
больше 5

(printout t "kurs:") % товвод повторяется

(bind?k (read))

)

(assert (student?name?k)) % добавляемфакт

)

)

2. Сохраните файл, например, под именем lab5-1.clp, затем загрузите его (File | Load…). Если в диалоговом окне выведено сообщение TRUE, то запустите на исполнение. Если появилось сообщение FALSE, то следует исправить ошибки

3. Протестируйте программу

 

Пример 2.

Создать правило prostoe, которое определяет, является простым или составным введенное натуральное число

 

Решение:

(defrule prostoe

=>

(printout t "n=")

(bind?n (read)) % вводим число

(bind?t (div?n 2)) % определяем возможный наибольший делитель числа-t

(bind?s "prostoe") % предполагаем, что число простое

(loop-for-count (?i 2?t) do % перебираем значения i от 2(наименьший делитель) до t

(if (= (mod?n?i) 0) then % если делитель найден

(bind?s "sostavnoe") % то число составное

)

)

(printout t?s crlf) % выводим результат

)

Пример 3.

Создать правило summa, которое находит сумму последовательных натуральных чисел от 1 до 10.

 

Решение:

(defrule summa

=>

(bind?sum 0) % обнуляемсумму

(loop-for-count (?n 1 10) do % перебираем n от 1 до 10

(bind?sum (+?sum?n)) % добавляем к сумме очередное n

)

(printout t "sum="?sum crlf)

)

 

Контрольные вопросы

1. Какая функция позволяет создать переменную и задать ее значение?

2. Какая функция реализует ветвление в CLIPS? Поясните ее структуру.

3. Какие функции используются для организации циклов? Объясните механизм работы каждой из них.

4. Какая функция обеспечивает множественный выбор? Поясните ее структуру.

 

Задания для самостоятельной работы

1. Создать правило zachisl, которое запрашивает количество студентов, вводит ФИО каждого и добавляет факты вида (student <фамилия> 1).

2. Создать правило spisok_sotr, которое запрашивает количество сотрудников, вводит ФИО и должность каждого и добавляет факты вида (sotrudnik <фамилия ><должность >).

3. Создать правило factorial для вычисления n!

4. Создать правило для вычисления суммы S=1/22+1/42+1/62+···+1/(2n)2

5. Первоначальная сумма вклада в банк составляет S0 руб., процентная ставка – р% годовых. Через сколько лет сумма вклада более чем в 2 раза превысит первоначальную? Создать соответствующее правило

6. Создать правило nod для нахождения наибольшего общего делителя двух натуральных чисел.

Подсказка: можно использовать алгоритм Евклида:

1) пока числа не равны, заменять большее из них разностью большего и меньшего.

2) когда числа станут равны, любое из них взять в качестве НОД

 

ФУНКЦИИ ПОЛЬЗОВАТЕЛЯ

 

Основные сведения

Под функцией в CLIPS понимается фрагмент исполняемого кода, с которым связано уникальное имя и который возвращает полезное значение или имеет полезный побочный эффект (например, вывод информации на экран).

Существует несколько типов функций. Пользовательские и системные функции - это фрагменты кода, написанные на внешних языках (например, на С) и связанные со средой CLIPS. Системными называются те функции, которые были определены изначально внутри среды CLIPS. Пользовательскими называются функции, которые были определены вне CLIPS.

Конструкция deffunction позволяет определять новые функции непосредственно в среде CLIPS с использованием синтаксиса CLIPS. Функции, определенные таким образом, выглядят и работают подобно остальным функциям, однако они выполняются не напрямую, а интерпретируются средой CLIPS.

Синтаксис:

(deffunction <имя_функции>

[<комментарии>]

<обязательные параметры>

[<групповой параметр>]

<действия>

)

Обязательные параметры определяют минимальное число аргументов, задаваемых при вызове функции. Если групповой параметр задан, то количество аргументов может быть больше. Определение функции может содержать только один групповой параметр, который обозначается символом $. Все необязательные аргументы группируются в одно значение составного поля.

Одна функция пользователя может вызывать другую функцию. При этом вызываемая функция должна быть определена до вызывающей.

Функции могут быть рекурсивны, т.е. вызывать сами себя. Необходимо помнить, что рекурсивная функция должна обязательно содержать условие, определяющее прекращение рекурсии.

 

Пример1.

Создать функцию, позволяющую пользователю задать вопрос и получить ответ типа да/нет.

Решение:

1. Создайте новый файл и наберите программу:

; функция ask-question с обязательным параметром?question (вопрос) и групповым параметром $?allowed-values (список допустимых ответов)

(deffunction ask-question (?question $?allowed-values)

(printout t?question); выводвопроса

(bind?answer (read)); вводответа

(if (lexemep?answer); если введено строковое значение

then (bind?answer (lowcase?answer ))); то символы строки преобразуем
в строчные

; пока пользователь не введет ответ, принадлежащий списку допустимых значений, повторять ввод

(while (not (member?answer?allowed-values)) do

(printout t?question)

(bind?answer (read))

(if (lexemep?answer)

then (bind?answer (lowcase?answer))))

?answer

)

 

; правило, задающее вопрос пользователю и в случае утвердительного ответа добавляющее факт в базу данных

(defrule yes-no

=>

; вызов функции и копирование полученного ответа в переменную?response

(bind?response (ask-question "color blue?(yes/no)" yes no y n))

(if (or (eq?response yes) (eq?response y)); еслиответ y или yes

then (assert (color blue)); тодобавляемфакт

)

)

2. Протестируйте программу для разных вариантов ответов, просматривая каждый раз базу данных.

 

Пример 2.

Создать функцию для определения периметра прямоугольного треугольника по длинам его катетов. Для вычисления гипотенузы создать отдельную функцию и использовать ее при определении периметра. Найти периметр прямоугольного треугольника для введенных значений катетов (создать соответствующее правило)

;функция для вычисления гипотенузы треугольника с катетами a и b

(deffunction gipotenuza (?a?b)

(sqrt (+ (**?a 2) (**?b 2))) ;определяем значение функции

)

;функция для вычисления периметрапрямоугольного треугольника с катетами a и b

(deffunction perimetr (?a?b)

(bind?c (gipotenuza?a?b)) ;вычисляем гипотенузу с помощью объявленной

; функции gipotenuza

(+?a?b?c)) ;определяем значение функцииperimetr

 

; правило для ввода значений катетов и вычисления периметра с использованием созданных функций

(defrule perim_treug

=>

(printout t "a=")

(bind?a (read)) ;ввод значения катета а

(printout t "b=")

(bind?b (read)) ;ввод значения катета b

(bind?p (perimetr?a?b)); вычисление периметра

(printout t "p="?p crlf)); вывод результата

 

Пример 3.

Создать рекурсивную функцию для вычисления факториала и правило, позволяющее вводить произвольное натурального числа и находить его факториал.

Факториал числа вычисляется как произведение натуральных последовательных чисел от 1 до n

n!=1*2*3*...*(n-1)*n.

Рекурсивно факториал можно определить следующим образом:

 
 


n!=

 

Например, 4!= 3!*4=2!*3*4=1!*2*3*4*= 0!*1*2*3*4*= 1*1*2*3*4=24

Решение:

; функция fact с аргументом n

(deffunction fact (?n)

(if (=?n 0) then 1; если n=0 то n!=1

else (*?n (fact (-?n 1))); иначеумножаем n на (n-1)!

)

)

; правило для ввода числа n и вычисления n!

(defrule fact_n

=>

(printout t "n=")

(bind?n (read)) ;ввод числа

(bind?fn (fact?n)); вызов функции с фактическим параметром n

(printout t?n "!="?fn crlf)); вывод результата

 

Контрольные вопросы

1. Какие типы функций существует в CLIPS?

2. Какая конструкция CLIPS позволяет создать новые функции? Поясните ее структуру.

3. С какой целью используется групповой параметр при описании функции пользователя?

4. Какие функции называются рекурсивными?

 

Задания для самостоятельной работы

1. Создать функцию для вычисления длины отрезка по заданным координатам его концов и , . Используя данную функцию найти периметр треугольника по координатам его вершин.

2. Создать функцию для вычисления площади треугольника по длинам его сторон, . Используя данную функцию сравнить площади двух треугольников, заданных длинами своих сторон.

3. Определить функцию для вычисления значения Y =f(X) с выбором формулы в соответствии с условием

 

 

4. Определить функцию для вычисления значения Y =f(X) с выбором формулы в соответствии с условием
 
 

5. Создайте логическую функцию, позволяющую пользователю задать вопрос и получить ответ типа да/нет. При утвердительном ответе функция возвращает значение TRUE, а при отрицательном - FALSE.

6. Создайте рекурсивную функцию для вычисления суммы вида

7. Создайте рекурсивную функцию для вычисления суммы вида
 
 

8. Создайте рекурсивную функцию для вычисления суммы вида
 
 

 
 

ОБРАБОТКА СТРОКОВЫХ ВЕЛИЧИН

 

Основные сведения

Для работы со строками в CLIPS имеются функции:

1. str-cat <список строк> - объединяет строки и возвращает ее в качестве результата.

Аргументы этой функции должны принадлежать одному из следующих типов: symbol, string, float, integer или instance-name.

2. sub-string <индекс первого символа>< индекс последнего символа ><строка> - выделяет из строки подстроку

Первый аргумент функции задает индекс первого символа выделяемой подстроки, а второй аргумент — последнего символа. Сама строка определяется последним аргументом. Если первый аргумент больше второго, функция возвращает 0.

3. str-index <подстрока><строка> - возвращает позицию заданной подстроки внутри строки.

Результат выполнения функции относится к целому типу и равен индексу первого символа подстроки. В случае если искомая подстрока не была найдена, функция str-index возвращает значение false.

4. upcase <строка> преобразует все символы строки в верхний регистр

5. lowcase <строка> преобразует все символы строки в нижний регистр

6. str-compare <строка1><строка2> сравнивает две строки.

Сравнение выполняется посимвольно до конца строк (если строки равны), либо пока не встретятся два неравных символа. Функция возвращает целое число, представляющее результат сравнения. Если сравниваемые строки равны, результатом является 0. Если первая строка меньше второй, результат — целое число меньше 0, и, наконец, если первая строка больше второй, возвращаемый результат – целое число больше 0. Аргументы функции должны принадлежать типу string или symbol.

7. str-length < строка > длина строки

Результат работы этой функции возвращается в виде целого числа

 

Пример 1.

Имеются факты вида:

(ocenka ivanov 4 5 5)

(ocenka sidorov 3 5 4)

(ocenka paramonova 4 4 4)

(ocenka orlov 5 5 4)

Вывести данные, выравнивая длину фамилий до 15 символов за счет добавления справа пробелов.

 

Решение:

; исходные факты

(deffacts ocenki

(ocenka ivanov 4 5 5)

(ocenka sidorov 3 5 4)

(ocenka paramonova 4 4 4)

(ocenka orlov 5 5 4)

)

; правило, формирующее список

(defrule spisok

(ocenka?name?o1?o2?o3); ищем факт, соответствующий образцу

=>

(bind?n (- 15 (str-length?name))) ;определяем кол-во добавляемых пробелов

(loop-for-count (?i 1?n) do; в цикле добавляем по одному нужное число
пробеловсправа

(bind?name (str-cat?name " "))

)

(printout t?name?o1 " "?o2 " "?o3 crlf); вывод

)

 

Пример2.

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

 

Решение:

(defrule kol_sym

=>

(bind?str (readline)) ;вводстроки

(bind?c (readline)) ;вводсимвола

(bind?n (str-length?str)) ;вычисляемдлинустроки

(bind?k 0); обнуляем счетчик символов

(loop-for-count (?i 1?n) do ;перебираем все символы строки

(bind?c1 (sub-string?i?i?str)) ;выделяем i-йсимвол

(bind?d (str-compare?c?c1)) ;сравниваем текущий символ строки с
заданным

(if (=?d 0) then ;если символы равны

(bind?k (+?k 1)) ;то увеличиваем значение счетчика на 1

)

)

(printout t "k="?k crlf) ;вывод результата

)

 

Пример3.

Создать функцию, удаляющую из заданной строки первое вхождение указанной подстроки

 

Решение:

; функция str-del с аргументами?substr (подстрока) и?str(строка)

(deffunction str-del (?substr?str)

(bind?n1 (str-length?substr)) ;вычисляемдлинуподстроки

(bind?n2 (str-length?str)) ;вычисляемдлинустроки

(bind?k (str-index?substr?str)) ;определяем позицию вхождения
подстроки в строку

(if (>?k 0) then; если подстрока содержится в строке

(bind?st1 (sub-string 1 (-?k 1)?str)); вырезаем часть строки слева от
подстроки

(bind?st2 (sub-string (+?k?n1)?n2?str)); вырезаем часть строки справа
от подстроки

(bind?str (str-cat?st1?st2)); объединяем полученные части

)

?str)

; правило substr_delete для ввода строки и подстроки и вызова функции str-del

(defrule substr_delete

=>

(bind?str (read))

(bind?substr (read))

(bind?str (str-del?substr?str))

(printout t "str="?str crlf))

 

Контрольные вопросы

1. Какая функция объединяет строки?

2. Назовите функцию, позволяющую выделить из строки подстроку.

3. Какая функция вычисляет длину строки?

4. Назовите функцию, позволяющую определить позицию вхождения подстроки в строку.

5. Какая функция используются для преобразования символов строки в верхний регистр?

6. Какая функция используются для преобразования символов строки в нижний регистр?

7. Назовите функцию, сравнивающую две строки. Какой результат возвращает функция в результате сравнения?

 

Задания для самостоятельной работы

1. Создайте правило, заменяющее в строке один указанный символ другим.

2. Создайте правило, заменяющее в заданной строке все пробелы на символ "_".

3. Создайте правило, удаляющее из заданной строки все вхождения указанной подстроки

4. Создайте функцию, добавляющую к заданной строке справа указанное количество символов ‘*’, и правило, которое вводит две строки и выравнивает их длины, добавляя к меньшей символы ‘*’.

5. Создайте функцию, позволяющую удалить из строки лишние пробелы, оставив по одному между словами.

6. Создайте функцию, позволяющую записать заданную строку в зеркальном отображении.

.

 


Рекомендуемая литература

 

ОГЛАВЛЕНИЕ

 

Введение……………………………………………………………………4

1. Интерфейс CLIPS. Вычисление математических выражений в режиме командной строки……………………………...………………….5

2. Факты в CLIPS. Упорядоченные факты…………………….………….9

3. Неупорядоченные факты. Сохранение и загрузка фактов…………..15

4. Правила. Использование условных элементов в записи правил…………………………………………………………..………….20

5. Процедурные функции…………………………………………………24

6. Функции пользователя…………………………………………………28

7. Обработка строковых величин………………………………….……..31

Литература…………………………………………………….……..........35


 

ВВЕДЕНИЕ

 

Предлагаемое методическое пособие представляет собой описание лабораторных работ по курсу «Интеллектуальные информационные системы» и предназначено для студентов, обучающихся по специальности «прикладная информатика в экономике».

Основная цель пособия – помощь студентам в подготовке к выполнению лабораторных работ по изучению языка программирования CLIPS, ориентированного на разработку экспертных систем.

Целью выполнения данных лабораторных работ является приобретение и усвоение студентами навыков работы в среде CLIPS (формальная постановка задачи, преобразование в форму, пригодную для пр


Поделиться с друзьями:

Механическое удерживание земляных масс: Механическое удерживание земляных масс на склоне обеспечивают контрфорсными сооружениями различных конструкций...

Папиллярные узоры пальцев рук - маркер спортивных способностей: дерматоглифические признаки формируются на 3-5 месяце беременности, не изменяются в течение жизни...

История развития пистолетов-пулеметов: Предпосылкой для возникновения пистолетов-пулеметов послужила давняя тенденция тяготения винтовок...

Таксономические единицы (категории) растений: Каждая система классификации состоит из определённых соподчиненных друг другу...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.348 с.