Назовем ту часть памяти системы, в которой содержатся записи о родственных отношениях, «Долгосрочной памятью». Другую часть назовем «Краткосрочной памятью» – это нечто вроде чернового блокнота для вычислений. Часть «Краткосрочной памяти» представляет собой область задач; в ней содержится список вопросов, на которые система пытается ответить. Системе нужно узнать, является ли Горди родным дядей по отношению ко мне (условное обозначение – Я). В самом начале память выглядит следующим образом:
На концептуальном уровне наша цель – ответить на вопрос; ответ будет положительным, если факт, которого он касается, истинен. На механическом уровне система должна определить, есть ли где-нибудь в ее памяти последовательность знаков, идентичная той последовательности, которую мы видим со знаком вопроса в колонке «Задачи». Функция одного из демонов системы – отвечать на вопросы, связанные с поиском, считывая аналогичные знаки в колонках «Задачи» и «Долгосрочная память». Обнаружив совпадение, он печатает метку рядом с вопросом, что означает, что вопрос получил положительный ответ. Для удобства давайте скажем, что метка имеет форму слова Yes (Да).
IF: Goal = blah-blah-blah?
Long-Term Memory = blah-blah-blah
THEN: MARK GOAL
Yes
(ЕСЛИ: Задача = то-то и то-то?
Долгосрочная память = то-то и то-то
ТО: МЕТКА ЗАДАЧИ
Да)
Концептуальная проблема, стоящая перед системой, состоит в том, что у нее нет эксплицитного знания о том, кто чей дядя. Это знание имплицитно следует из других фактов, которые она знает. На механическом уровне то же самое будет значить вот что: в разделе «Долгосрочная память» нет метки uncle-of (дядя); там есть только метки sibling-of (брат/сестра) и parent-of (родитель). На концептуальном уровне нам нужно вывести знание о том, кто чей дядя, из знания о том, кто приходится кому родителем и братом/сестрой. На механическом уровне нам нужен демон, который сделает запись uncle-of (дядя), по обе стороны от которой будут нужные метки, обнаруженные в записях с элементами sibling-of (брат/сестра) и parent-of (родитель). На концептуальном уровне нам нужно выяснить, кто у нас родители, идентифицировать их братьев и сестер, потом выбрать из них лиц мужского пола. На механическом уровне нам нужен следующий демон, который сделает в области «Задачи» новые записи, запускающие соответствующие операции поиска в памяти:
IF: Goal = Q uncle-of Р
THEN: ADD GOAL
Find P’s Parents
Find Parents’ Siblings
Distinguish Uncles/Aunts
(ЕСЛИ: Задача = Q дядя PTO: ДОБАВИТЬ ЗАДАЧУ
Найти родителей Р
Найти братьев/сестер родителей
Различить дядь/теть)
Этот демон запускается записью uncle-of (дядя) в колонке «Задачи». В этой колонке действительно есть такая запись, поэтому демон начинает действовать и добавляет к этой колонке новые метки:
Необходим также элемент программы – еще один демон или дополнительный механизм внутри данного демона, который будет отвечать за Р и Q, то есть заменять ярлык Р списком конкретных ярлыков имен: Me (Я), Abel (Абель), Gordie (Горди) и т. д. Эти детали я здесь не привожу, чтобы не усложнять восприятие процесса.
Новые записи в колонке «Задачи» побуждают к действию других демонов. Один из них (на концептуальном уровне) ищет родителей системы, копируя (на механическом уровне) все записи, содержащие имена родителей, в раздел «Краткосрочная память» (если только там уже нет таких записей, конечно; это условие необходимо, чтобы демон не продолжал бессмысленно делать одну копию за другой, как ученик чародея):
IF: Goal = Find P’s Parents
Long-Term Memory = X parent-of P
Short-Term Memory ≠ X parent-of P
THEN: COPY TO Short-Term Memory
X parent-of P
ERASE GOAL
(ЕСЛИ: Задача = найти родителей P
Долгосрочная память = X родитель P
Краткосрочная память ≠ X родитель P
ТО: КОПИРОВАТЬ В КРАТКОСРОЧНУЮ ПАМЯТЬ
X родитель P
СТЕРЕТЬ ЗАДАЧУ)
Теперь наша доска объявлений выглядит следующим образом:
Теперь, когда мы знаем родителей, мы можем найти братьев и сестер родителей. На механическом уровне это означает, что теперь, когда имена родителей записаны в разделе «Краткосрочная память», может начинать работу демон, копирующий записи о братьях и сестрах родителей:
IF: Goal = Find Parents’ Siblings
Short-Term Memory = X parent-of Y
Long-Term Memory = Z sibling-of X
Short-Term Memory
Z sibling-of X
THEN: COPY TO Short-Term Memory
Z sibling-of X
ERASE GOAL
(ЕСЛИ: Задача = найти родителей P
Краткосрочная память = X родитель Y
Долгосрочная память = Z брат/сестра X
Краткосрочная память
Z брат/сестра X
ТО: КОПИРОВАТЬ В КРАТКОСРОЧНУЮ ПАМЯТЬ
Z брат/сестра X
СТЕРЕТЬ ЗАДАЧУ)
Вот что у него получается:
На данном этапе мы рассматриваем дядь и теть вместе. Чтобы отделить дядь от теть, нам нужно найти среди них мужчин. На механическом уровне система должна найти записи, рядом с которыми в разделе «Долгосрочная память» стоят метки is-male (мужского пола). Вот демон, который выполняет эту проверку:
IF: Goal = Distinguish Uncles/Aunts
Short-Term Memory = X parent-of Y