10.4.1. Постановка задачи и составление программы
Постановка задачи
1. Дан ребус: GERALD + DONALD = ROBERT.
2. В словах GERALD, DONALD и ROBERT вместо букв необходимо поставить цифры таким образом, чтобы получилось математически правильное выражение. Разным буквам должны соответствовать разные цифры.
3. Требуется написать программу решения ребуса.
Алгоритм решения
1. Рассмотрим первые разряды всех трех чисел. Считаем, что первый разряд − это единицы, второй разряд – это десятки, третий – сотни и т.д. Очевидно, что нахождение множества пар (буква–цифра), входящих в решение задачи, должно удовлетворять условию:
(((D + D) mod 10) = Т) & (D ? Т). (10.1)
2. Рассмотрим второй разряд совместно с первым. Необходимо подобрать такие числа L и R, чтобы остаток отделения суммы (L*10 + L*10 + D + D) на 100 был равен (R*10 + Т). При этом следует учесть, что L и R не равны между собой и не равны D и Т.
Таким образом, среди множества пар (буква–цифра), удовлетворяющих первому условию, необходимо найти такие, чтобы:
(((L*10 + L*10 + D + D) mod 100) = (R*10 + T))&(D?T?L?R). (10.2)
3. Продолжая действовать подобным образом, можно выписать конечное условие, которому должны удовлетворять пары (буква–цифра), входящие в решение данной задачи.
Решение задачи
Сформулируем описанный выше подход к решению в терминах CLIPS.
Представим комбинации из одной буквы и одной цифры в виде фактов:
(combination D 0), (combination D 1), (combination A 1) и т.д.
В первую очередь составим правило для нахождения комбинаций (буква- цифра), удовлетворяющих условию (10.1):
(defrule find_solution
(combination D ?d)
(combination T ?t&~?d)
(test (= (mod (+ ?d ?d) 10) ?t))
=>
(printout t "A solution is:" t t)
(printout t " D = " ?d t)
(printout t " T = " ?t t))
Данное правило выполнимо только в том случае, если в списке фактов существуют факты, удовлетворяющие условиям:
(combination D ?d) – все факты, в которых в первой и во второй позициях стоят «combination» и «D» соответственно, а в третьей позиции любое значение, это значение присваивается переменной ?d.
(combination Т ?t&~?d) – все факты, в которых в первой и во второй позициях стоят «combination» и «Т» соответственно, а в третьей позиции − любое значение, только не то, которое было присвоено переменной ?d, это значение присваивается переменной ?t. Знак «&» означает логическое «и» (and), а знак «~» – логическое «не» (not). Выражение «?t&~?d» означает, что переменная ?t может принимать значение, не равное значению переменной ?d.
(test (= (mod (+ ?d ?d) 10) ?t)) – это условие проверяет на равенство два выражения (mod (+ ?d ?d) 10) и (?t)).
Команда (printout t "A solution is:" t t) выводит на экран информацию, которая указывается после команды в полях, разделенных пробелами. Чтобы вывести текст, его необходимо заключить в кавычки, а перед кавычками поставить букву t. Эта буква указывает, что в следующем поле находится текст, взятый в кавычки, и который необходимо напечатать. Если после буквы t нет текста в кавычках, то происходит перевод курсора на новую строку.
Перевести курсор на новую строку можно путем указания комбинации символов «crlf» без кавычек. Для вывода значения переменной необходимо просто указать ее имя.
Пример.
printout t " Т = " ?t t)
Оператор выводит текст Т= и значение переменной ?t, а затем переводит курсор на новую строку.
Рассмотренное правило позволяет найти все комбинации (буква–цифра), удовлетворяющие условию для первых разрядов трех чисел. По аналогии с этим правилом составим конечное правило для нахождения решения:
(defrule find-solution
(combination D ?d)
(combination T ?t'&~?d)
(test (= (mod (+ ?d ?d) 10) ?t))
(combination L ?l&~?d&~?t)
(combination R ?r&~?d&~?t&~?l)
(test (= (mod (+ ?d ?d (* 10 ?1) (* 10 ?l) ?t)) 100)
(combination A ?a&~?d&~?t&~?l&~?r)
(combination E ?e&~?d&~?t&~?l&~?r&
(test (= (mod (+ ?d ?d (* 10 ?1) ((* 100 ?a) (* 100 ?a)) 1000)
(+ (* 100 ?e) (* 10 ?r) ?t)))
(combination N ?n&~?d&~?t&~?i&~?r&~?a&~?&e)
(combination В ?b&~?d&~?t&~?l&~?r&~?a&~?&e~?&n)
(test ( = (mod (+ ?d ?d (* 10 ?1) (* 10 ?l)
(* 100 ?a) (* 100 ?a) (* 1000 ?r) (*1000 ?n)) 10000)
(+ (* 1000 ?b) (* 100 ?e)(* 10 ?r) ?t)
(combination 0 ?o&~?d&~?t&~?l~?r&~?а&~?е&~?n&~?b)
(combination G ?g&~?d&~?t&~?l&~?&~?а&~?е&~?n&~?b~?о)
(test(=(+ ?d ?d
(* 10 ?l)(*10 ?l)
(* 100 ?а) {* 100 ?а)
(* 1000 ?r) (* 1000 ?n)
(10000 ?е) (* 10000 ?о)
(* 100000 ?q) (* 100000 ?d))
(+(*100000 ?r)(* 10000 ?о) (* 1000 ?b)(* 100 ?е)(* 10 ?r) ?t)))
=>
(printout t "A solution is: " t)
(printout t "G = " ?g t)
(printout t "E = " ?e t)
(printout t "R = " ?r t)
(printout t "A = " ?а t)
(printout t "L = " ?l t)
(printout t "D = " ?d t)
(printout t "O = " ?o t)
printout t "N = " ?n t)
(printout t "B = " ?b t)
(printout t "T = " ?t t)
(printout t " " ?g ?e ?r ?a ?l ?d t)
(printout t "+" ?d ?o ?n ?a ?l ?d t)
(printout t " " "---------" t)
(printout t " = " ?r ?o ?b ?e ?r ?t t t)
Теперь для поиска решения остается занести факты, соответствующие комбинациям из одной буквы и одной цифры, в список фактов. Это можно сделать командой assert.
(assert (combination D 0) (combination D 1)
(combination A 1)
(combination L 9)
...)
Однако, т.к. количество фактов равно 100, лучше поступить по-другому. Сопоставим буквам и цифрам следующие факты:
(number 0), (number 1), (number 2), … , (number 9), (letter G), (letter E), (letter R), (Letter A), (letter L), (letter D), (letter O),(Letter N), (letter B), (letter T).
Составим правило, по которому в список фактов будут заноситься факты, соответствующие комбинациям из одной буквы и одной цифры.
(defrule generate_combination
(number ?x)
(letter ?y)
=>
(assert (combination (?y ?x))))
Согласно данному правилу, если в списке фактов присутствуют факты, имеющие вид (number ?x), (letter ?y), где вместо переменных стоят вполне конкретные значения, в список фактов добавляется еще один факт − (combination ?y ?х), в котором вместо переменных стоят значения из фактов.
Наконец, составим правило, в соответствии с которым, во-первых, на экран будет выводиться условие задачи, а во-вторых, в список фактов будут заноситься факты, соответствующие буквам и цифрам. Поскольку это правило должно выполняться всегда, то его условная часть будет пустой.
(defrule startup
=>
(printout t t "The problem is" t t)
(printout t " GERALD" t)
(printout t "+ DONALD" t)
(printout t "------------" t)
(printout t " = ROBERT" t t)
(assert
(number 0) (number 1) (number 2) (number 3) (number 4)
(number 5) (number 6) (number 7) (number 8) (number 9)
(letter G) (letter E) (letter R) (letter A) (letter L)
(letter D) (letter O) (letter N) (letter B) (letter T)))
Таким образом, рассмотренная программа состоит из трех правил: startup, generate_combination и find_solution. Первое из них выводит на экран условие задачи и добавляет в список факты, соответствующие отдельным буквам и цифрам. Второе правило, используя факты, введенные в список фактов первым правилом, заносит в список фактов факты, которые представляют собой всевозможные комбинации из десяти цифр и десяти букв. Третье правило позволяет найти среди этих фактов те, которые удовлетворяют условию задачи, и выводит на экран полученное решение.
Перейдем к порядку выполнения разработанной программы в ИО CLIPS.
- Содержание
- 1. Базы данных, ориентированные на искусственный интеллект 18
- 2. Формализация знаний о проблемной области 37
- 3. Инструментальные средства логического программирования 67
- 4. Организация принятия решений в экспертных системах 100
- 5. Интеллектуальные технологии обработки информации 115
- 6. Система моделирования эо kappa 158
- 7. Стандартные функции эо kappa 180
- 8. Работа с правилами в эо kappa 193
- 9. Создание интерфейса пользователя в эо kappa 206
- 10. Инструментальная оболочка разработки эс − clips 223
- 10.2.3. Правила 231
- 11. Разработка экспертной системы в ио clips 261
- 12. Создание проекта онтологии с помощью ис Protégé 291
- Предисловие
- Список сокращений
- Введение
- 1. Базы данных, ориентированные на искусственный интеллект
- 1.1. Экспертные системы и их особенности
- 1.2. Основные типы задач, решаемых с помощью экспертных систем
- 1.3. Особенности разработки экспертных систем
- 1.3.1. Приобретение знаний
- 1.3.2. Представление знаний
- 1.3.3. Реализация
- 1.4. Виды экспертных систем
- 1.5. Представление знаний в системах искусственного интеллекта
- 1.5.1. Данные и знания
- 1.5.2. Представление знаний в рабочей памяти эвм
- 1.5.3. Представление знаний в базе знаний
- Контрольные вопросы
- 2. Формализация знаний о проблемной области
- 2.1. Таксономическая классификационная схема
- 2.2. Онтологический подход к представлению проблемной информации
- 2.2.1. Цели разработки онтологий
- 2.2.2. Фундаментальные правила разработки онтологии
- 2.2.3. Определение области и масштаба онтологии
- 2.2.4. Рассмотрение вариантов повторного использования существующих онтологий
- 2.2.5. Перечисление важных терминов в онтологии
- 2.2.6. Определение классов и их иерархии
- 2.2.7. Определение свойств классов – слотов
- 2.2.8. Определение фацетов слотов
- 2.2.9. Домен слота и диапазон значений слота
- 2.2.10. Создание экземпляров
- 2.3. Модели представления знаний
- 2.3.1. Фреймы
- 2.3.2. Семантические сети
- 2.3.3. Исчисление предикатов первого порядка
- 2.3.4. Модель представления знаний в виде правил продукции
- Контрольные вопросы
- 3. Инструментальные средства логического программирования
- 3.1. Язык логического программирования Пролог
- 3.2. Основные разделы программы
- 3.3. Рекурсивные вычисления в Пролог-программе
- 3.4. Процесс реализации вывода
- 3.5. Предикаты
- 3.6. Списковые структуры
- 3.7. Вызов внешних функций из Пролог-программы и интерфейс с программами на других языках программирования
- 3.8. Пример реализации экспертной системы на языке Пролог
- 3.9. Диалекты и языки, используемые для задач искусственного интеллекта
- Контрольные вопросы
- 4. Организация принятия решений в экспертных системах
- 4.1. Организация логического вывода в экспертных системах
- 4.2. Правила
- 4.3. Поиск решений
- 4.4. Управляющая структура
- 4.5. Технологии принятия решений в системах с базами знаний
- 4.6. Методы поиска, реализованные в экспертных системах
- 4.7. Использование процедур
- 4.8. Представление неопределенности в информационных приложениях с базами знаний
- Контрольные вопросы
- 5. Интеллектуальные технологии обработки информации
- 5.1. Интеллектуальные системы, основанные на нечеткой логике
- 5.2. Нейронные сети
- 5.2.1. Биологический и искусственный нейроны
- 5.2.2. Классификация нейронных сетей
- 5.2.3. Задачи, решаемые с помощью нейронных сетей
- 5.3. Эволюционные вычисления
- 5.3.1. Основные определения
- 5.3.2. Процесс работы генетического алгоритма
- 5.3.3. Пример решения задачи с использованием генетического алгоритма
- 5.3.4. Достоинства и недостатки генетических алгоритмов
- 5.4. Комплексный подход к проектированию систем искусственного интеллекта
- 5.5. Инструментальные средства представления знаний
- 5.5.1. Классификация оболочек эс
- 5.5.2. Уровни реализации экспертных систем
- Контрольные вопросы
- 6. Система моделирования эо kappa
- 6.1. Представление знаний в эо kappa
- 6.2. Начало работы с эо kappa
- 6.3. Окно иерархии объектов (Object Browser)
- 6.4. Окно инструментов (Knowledge Tools) и редакторы знаний
- 6.4.1. Редактор классов (Class Editor)
- 6.4.2. Редактор объектов (Instance Editor)
- 6.4.3. Редактор слотов (Slot Editor)
- 6.4.4. Редактор методов (Method Editor)
- 6.4.5. Редактор функций (Function Editor)
- 6.4.6. Редактор правил (Rule Editor)
- 6.4.7. Редактор цели (Goal Editor)
- 6.5. Окно интерпретатора (kal Interpreter)
- 6.6. Окно сеанса (Session)
- 6.7. Окно связи правил (Rule Relations)
- 6.8. Окно трассировки правил (Rule Trace)
- 6.9. Окно просмотра иерархии выводов (Inference Browser)
- 6.10. Средство объяснений эо kappa
- Контрольные вопросы
- 7. Стандартные функции эо kappa
- 7.1. Функции манипулирования знаниями
- 7.1.1. Функции работы с классами
- 7.1.2. Функции работы с объектами
- 7.1.3. Функции работы с иерархией объектов
- 7.1.4. Функции работы со слотами
- 7.1.5. Функции работы с методами
- 7.1.6. Функции работы с правилами
- 7.1.7. Функции работы с целями
- 7.2. Математические функции
- 7.3. Функции работы со строками
- 7.4. Функции работы со списками
- 7.5. Логические функции
- 7.6. Функции работы с файлами
- 7.7. Функции управления
- 7.8. Функции работы с окнами
- 7.9. Функции работы с компонентами
- 7.10. Функции, определенные пользователем
- Контрольные вопросы
- 8. Работа с правилами в эо kappa
- 8.1. Создание и редактирование правил
- 8.2. Формирование списка правил
- 8.3. Создание и редактирование цели
- 8.4. Рассуждения в прямом направлении
- 8.4.1. Стратегии принятия решения
- 8.4.2. Формирование прямой цепи рассуждений
- 8.4.3. Активная трассировка при формировании прямой цепи рассуждений
- 8.5. Рассуждения в обратном направлении
- Контрольные вопросы
- 9. Создание интерфейса пользователя в эо kappa
- 9.1. Стандартные компоненты интерфейса пользователя
- 9.1.1. Компонент Button
- 9.1.2. Компонент Text
- 9.1.3. Компонент Transcript
- 9.1.4. Компонент Edit
- 9.1.5. Компонент BitMap
- 9.1.6. Компонент Drawing
- 9.1.7. Компонент StateBox
- 9.1.8. Компонент Meter
- 9.1.9. Компонент LinePlot
- 9.1.10. Компонент Slider
- 9.1.11. Компонент SingleListBox
- 9.1.12. Компонент MultipleListBox
- 9.1.13. Компонент CheckBox
- 9.1.14. Компонент CheckBoxGroup
- 9.1.15. Компонент RadioButtonGroup
- 9.2. Особенности русификации эо kappa
- Контрольные вопросы
- 10. Инструментальная оболочка разработки эс − clips
- 10.1. Общие сведения об ио clips
- 10.2. Программирование в ио clips
- 10.2.1. Основные элементы программирования
- 10.2.2. Факты
- 10.2.3. Правила
- 10.2.4. Переменные
- 10.2.5. Дополнительные средства
- 10.3 Интерфейс ио clips
- 10.3.1 Интерфейс командной строки
- 10.3.2. Графический интерфейс пользователя
- 10.3.3. Интерфейс встроенного редактора
- 10.4. Организация работы в ио clips
- 10.4.1. Постановка задачи и составление программы
- 10.4.2. Запуск ио clips
- 10.4.3. Ввод программы
- 10.4.4. Загрузка и запуск программы
- 10.4.5. Работа программы
- 10.4.6. Сохранение результатов работы
- Контрольные вопросы
- 11. Разработка экспертной системы в ио clips
- 11.1. Подготовка исходных данных
- 11.2. Выделение сущностей
- 11.3. Сбор информации
- 11.4. Диагностические правила
- 11.5. Листинг программы
- 11.6. Выполнение программы
- Контрольные вопросы
- 12. Создание проекта онтологии с помощью ис Protégé
- 12.1. Создание нового проекта
- 12.2. Структура проекта
- 12.3. Работа с классами
- 12.3.1. Создание нового класса
- 12.3.2. Создание экземпляра класса
- 12.3.3. Инструменты работы с классами
- 12.4. Работа со слотами
- 12.5. Сохранение проекта в формате rdf
- 12.6. Экспорт онтологии в формат эо clips
- Контрольные вопросы
- Заключение
- Глоссарий
- Библиографический список