Сначала я был озабочен тем, как сделать грамматику гибкой и рекурсивной, чтобы не возникало впечатления, что программа просто механически подставляет слова в пробелы некоего трафарета. Примерно тогда же я наткнулся на статью Виктора Ингве в «Scientific American», в которой он описывал простую, но гибкую грамматику, способную порождать большое количество разнообразных предложений того типа, который можно найти в некоторых детских книгах. Я модифицировал некоторые идеи этой статьи и у меня получился набор процедур, составивших грамматику типа Схемы Рекурсивных Переходов, описанной в главе V. В этой грамматике выбор слов в предложении определялся процессом, который сначала выбирал наугад общую структуру предложения; постепенно процесс принятия решений распространялся на более низкие уровни предложения, пока не достигался уровень слов и букв. Многое должно было делаться ниже уровня слов, как например, спряжение глаголов и постановка слов во множественное число. Неправильные глаголы и существительные сначала формировались по общим правилам и затем, если результат совпадал с записанным в специальной таблице, производилась замена на нужную — нерегулярную — форму. Как только каждое слово достигало конечной формы, оно печаталось. Программа напоминала знаменитую обезьяну за пишущей машинкой, но оперировала при этом сразу на нескольких лингвистических уровнях, а не только на уровне букв.
В начале я нарочно использовал дурацкий набор слов, так как мне хотелось достичь забавного результата. Программа произвела множество бессмысленных предложений, как длинных, так и совсем кургузых. Вот несколько примеров, в переводе с английского:
Карандаш-самец, который должен неуклюже смеяться, будет квакать. Не должна ли программа всегда хрустеть девочкой в памяти? Десятичный жук, который неуклюже плюется, может крутиться. Кекс, принимающий неожиданного человека во внимание, может всегда уронить карту.
Программа должна работать весело.
Достойная машина не всегда должна приклеивать астронома.
О, программа, которая должна действительно убегать от девочки, пишет музыканта для театра. Деловые отношения квакают.
Счастливая девочка, которая всегда должна квакать, никогда не будет квакать наверняка.
Игра квакает. Профессор напишет маринованный огурчик. Жук крутится.
Человек берет соскальзывающую коробку.
Впечатление от всего этого получается сюрреалистическое; иногда отрывки текста напоминают хайку, как, например, последний пример четырех коротких предложений. Сначала все это кажется забавным и милым, но вскоре надоедает. Прочитав несколько страниц компьютерной продукции, вы можете заметить границы того пространства, в котором оперирует программа, после чего случайные точки в пределах этого пространства — даже если каждая из них и выглядит «новой» — уже вас не удивят. Мне кажется, что это — общий принцип: предмет надоедает вам не тогда, когда вы исчерпали репертуар его поведения, но тогда, когда вы поняли, где находятся границы, внутри которых это поведение может варьироваться. Пространство поведения человека достаточно сложно, чтобы постоянно удивлять других людей; однако в отношении моей программы это оказалось не так. Я понял, что моя цель — производство действительно смешных предложений — требует от программы гораздо большей тонкости. Но что, в данном случае, означает «тонкость»? Ясно было одно — случайные комбинации слов этой тонкостью не обладали. Необходимо было сделать так, чтобы слова использовались в соответствии с реальностью. Именно тогда я начал задумываться о представлении знаний.
Идея, которую я принял на вооружение, состояла в том, чтобы классифицировать каждое слово — существительное, глагол, предлог и т. д. — согласно разным «семантическим измерениям». Таким образом, каждое слово становилось членом различных классов; кроме этого, существовали также суперклассы — классы классов (что напоминает замечание Улама). В принципе, подобная классификация может иметь любое количество уровней, но я решил остановиться на двух. Теперь в любой момент выбор слов был семантически ограничен, поскольку требовалось, чтобы части составляемой фразы