Место представления знаний в символическом искусственном интеллекте

В интеллектуальной области невозможно создать универсальный алгоритм, подходящий для решения любой задачи. Этим интеллектуальные задачи отличаются от других, неинтеллектуальных, в которых существуют алгоритмы «делай раз, делай два, делай три...». Метод решения задачи в интеллектуальной области — это всегда поиск новых подходов, новых путей и, в конце концов, если ничего не удается придумать, — банальный перебор всех возможностей в поисках решения.

Итеративный характер решения задач

Общая схема решения проблемы с помощью компьютера изображена на рис. 1.7. Стрелочки слева направо — детерминированный процесс, стрелочки справа налево — недетерминированный. Решение проблемы всегда носит, в целом, недетерминированный характер. Эго метод проб и ошибок, метод поиска, в результате которого часто приходится возвращаться на предыдущие шаги.

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

Схема процесса решения задачи на компьютере

Рис. 1.7. Схема процесса решения задачи на компьютере

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

Наше резюме таково. Если задача не имеет прямого алгоритма решения, решается методом перебора вариантов и возвраты осуществляются не через голову программиста, а через саму программу, то это прикладная система с элементами искусственного интеллекта. Если же задача имеет прямой алгоритм решения, который находит программист (может быть, за несколько попыток), но не сама программа, то искусственный интеллект отсутствует (возможно, присутствует естественный интеллект программиста). Но фактически непроходимой границы между этими случаями нет. Искусственная интеллектуальность программы не является дискретным свойством, принимающим только значения 0 или 1, все или ничего. Напротив, искусственная интеллектуальность — это непрерывная величина, принимающая любые значения из интервала (0, 1). Чем больше петель обратной связи на рис. 1.7 проходит не через голову программиста, а через компьютер, тем выше мера интеллектуальности программы.

Явно выраженную границу между знанием и незнанием указать невозможно. Точной границы для представления знаний в компьютере нет: всякая программа и всякие данные отражают какие-то знания. В то же время самые тонкие философские соображения можно записать в компьютер на естественном языке, и они будут там представлены бессмысленной последовательностью байтов. Байты присутствовать в компьютере будут, но философские знания — нет. Точнее говоря, ничто в компьютере не есть знания без нашей собственной интерпретации, и почти из всего можно извлечь знание, если как следует постараться. Более строго, везде в этой книге (если явно не оговаривается иное) мы подразумеваем следующую трактовку понятия «знание»:

Знания {компьютерные) — это совокупность строго фиксированных

информационных структур и вполне определенных правил и стратегий

обработки этих структур (правил интерпретации).

Рассмотрим это па модельном примере.

Допустим, мы хотим, чтобы компьютер напечатал набор чисел в порядке их возрастания. Мы, люди, несомненно, знаем, как это сделать. Рассмотрим, можем ли мы научить компьютер делать это, т.е. можем ли мы представить необходимые знания в компьютере? Пусть нам заранее известно, что этих чисел три и они равны 3, 5 и 7. Можно научить компьютер решать данную задачу, написав всего один оператор:

Write (3, 5, 7)

Таким образом, мы представили в компьютер знания, достаточные для решения этой отдельной частной задачи. Знания представлены в форме одного оператора языка программирования.

Усложним задачу. Пусть чисел по-прежнему три, но при этом значение их произвольное. Составим процедуру Sort3, способную отсортировать эти числа по возрастанию (знак :=: означает взаимное присваивание, т.е. обмен значениями переменных):

proc Sort3 (х, у, z)

if х > у then х : = : у end if

if у > z then у : = : z end if

if x > у then x : = : у end if

Write (x, y, z) end proc

Таким образом, мы научили компьютер решать довольно большое множество задач, связанных с сортировкой трех чисел по возрастанию, не слишком удлинив при этом запись. Во всяком случае, данная запись намного меньше, чем все возможные операторы Write со всеми возможными комбинациями аргументов[1]. Знания представлены в форме процедуры с параметрами. Другими словами, механизм процедур в языках программирования — это уже метод представления знаний. Просто это достаточно старый метод, мы к нему привыкли и уже не воспринимаем как механизм представления знаний.

Возникает еще один вопрос: откуда взялась процедура Sort3?

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

Поскольку в процедуре Sort3 есть фрагменты кода, похожие друг на друга, и их больше двух, следует применить специальный рефакторинг (преобразование текста программы, не меняющее выполняемую программой функцию), который называется запроцедуривание. Запроцедуривание — это такой рефакторинг, при котором повторяющиеся или похожие фрагменты программы заменяются вызовом вновь введенной процедуры. Переписав процедуру Sort3, введя процедуру Sort2, получаем процедуру Sort3':

proc Sort3' (х, у, z)

Sort2(х, у)

Sort2(у, z)

Sort2(х, у)

Write (х, у, z) end proc proc Sort2(u, v)

if u > v then u : = : v end if end proc

Однако процедуру Sort2 нетрудно специфицировать формально:

{х, у} Sort2 (х, у) {х < у}

Здесь перед заголовком процедуры (Sort2 (х, у) ) выписано предусловие, а после заголовка — постусловие. Процедура Sort2 очень проста и, очевидно, полезна во многих случаях. Можно допустить, что эта процедура вместе со спецификацией (предусловие и постусловие) содержится в библиотеке готовых процедур, доступной транслятору.

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

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

Тогда, используя эту спецификацию, транслятор может логически вывести процедуру Sort3': {X, У, z}

Sort2(х, у) {х < у, г)

Sort2(y, z) {у < z, x < z)

Sort2 (x, у) {x < у < z)

Write (x, y, z) .

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

Кажется, что понятия «знание» и «процедура» ортогональны. Если есть процедура, никакие знания не нужны: делай, как сказано в процедуре, и задача будет решена. Приведенный пример показывает, что понятия «знание» и «процедура» (или, лучше сказать, алгоритм) не только не противоположны, но даже, можно сказать, неразделимы. Любой алгоритм обязательно содержит знания, а любые компьютерные знания представляются, в конечном счете, алгоритмами.

  • [1] Заметим, что поскольку количество различных чисел, представимых в компьютере,конечно, количество различных операторов Write с различными аргументами такжеконечно, хотя и довольно велико.
 
Посмотреть оригинал
< Пред   СОДЕРЖАНИЕ   ОРИГИНАЛ     След >