Category: философия

Category was added automatically. Read all entries about "философия".

Бритоголовый и С1-97

Необычное программирование

Этнограф сидит напротив шамана и думает: “Бедный, невежественный дикарь! Неужели он правда считает, что в мире духов действительно существует такой же Енисей, такая же тайга и такие же олени? Вот примитивная какая религия!”
Шаман сидит напротив этнографа и думает: “Вот блин, как же мне объяснить этому доброму, но бедному и невежественному дикарю, что сакральный топос отличается от профанного субстанциально, а не экзистенциально? О! Скажу-ка я ему, что в мире духов существует такой же Енисей, такая же тайга и такие же олени – авось хоть что-то поймет”.

Обещал написать запись о программировании с некими извращенными “философскими основаниями”. Сначала мне показалось, что все будет сложно – но получилось “сразу и на одном дыхании”, так что читайте, не отрываясь от предыдущей записи.

Для начала стоит кратенько изложить необходимую философию, потому что она может показаться ну очень необычной – все-таки в большинстве “кратких изложений” истории философии до этого не доходят. Опираться будем на “Логико-философский трактат” Л. Витгенштейна – но обойдемся мы всего лишь некоторыми утверждениями из него и некоторыми комментариями.

Есть некое хорошо известное высказывание – “вся европейская философия – это комментарии к Платону и Аристотелю”. У него есть менее известное “добавление” – “до Витгенштейна”. Платон и Аристотель предполагали первичным существование вещей – Витгенштейн же утверждает следующее:

<…>
1.1. Мир есть совокупность фактов, а не вещей.
1.11. Мир определен фактами и тем, что это все факты.
1.12. Потому что совокупность всех фактов определяет как все то, что имеет место, так и все то, что не имеет места.
<…>
2. То, что имеет место, что является фактом, – это существование атомарных фактов.
2.01. Атомарный факт есть соединение объектов (вещей, предметов).
<…>
2.012. В логике нет ничего случайного: если предмет может входить в атомарный факт, то возможность этого атомарного факта должна предрешаться уже в предмете.
<…>
2.013. Каждая вещь существует как бы в пространстве возможных атомарных фактов. Это пространство я могу мыслить пустым, но не могу мыслить предмет без пространства.
<…>
2.0141. Возможность вхождения объекта в атомарные факты есть его форма.

Комментаторы Витгенштейна обычно понимают это следующим образом: первичными являются не предметы, а “факты” – то есть утверждения о предметах. Каждый предмет определяется совокупностью всех фактов, в которые он может входить.

Какое отношение это может иметь к программированию? Действительно, “обычное”, то есть в современных реалиях – объектно-ориентированное программирование, изначально оперирует предметами. Но в том же “Логико-философском трактате” содержится очень интересная мысль о том, что “естественный язык” может ограничивать способности к познанию. В нашем случае “естественным” языком будет что-нибудь вроде C++ или Java – и они, разумеется, ограничивают нас тем, что требуют описывать объекты, а не факты.

Витгенштейн в качестве выхода из такой ситуации предлагал создание “универсального языка”, похожего на исчисление предикатов. Мы не будем этим заниматься, а попробуем увидеть нечто подобное на простых примерах. Для начала – вспомним про задачку о формулах.

Один из способов решения этой задачки – небольшое количество кода на Lisp, позволяющее описать, скажем, формулу, связывающую температуру по Цельсию и Фаренгейту 9C = 5(F – 32) следующим образом:

(define (celsius-fahrenheit-converter c f)
   (let ((u (make-connector))
         (v (make-connector))
         (w (make-connector))
         (x (make-connector))
         (y (make-connector)))
     (multiplier c w u)
     (multiplier v x u)
     (adder v y f)
     (constant 9 w)
     (constant 5 x)
     (constant 32 y)
     'ok))

Выражения с multiplier, adder и constant описывают следующие взаимоотношения между переменными:

c * w = u
v * x = u
v + y = f
w = 9
x = 5
y = 32

Если упростить эти формулы, то получим уравнение 9c = 5(f – 32) – как раз то, что мы хотели получить. При этом наше описание оказывается (благодаря определениям “простейших” примитивов) таким, что может вычислять выражение в “обе стороны” (про использование этой “системы” читайте в SICP по ссылке). Возможно, этот пример окажется не совсем корректным – все-таки мы начинаем с определения “объектов” в выражении присваивания (let), но он довольно прост для понимания. Кстати, попробуйте реализовать что-то подобное “объектно-ориентированным” способом – окажется, что явно выделить “объекты” в этой задаче не совсем просто, а часть из них будет явно излишней.

Давайте пойдем дальше. А именно, попробуем сделать игру в жанре “текстовый квест”. В качестве “движка” выберем Inform 7, позволяющий компилировать вот такие описания:

"Hello Deductible" by "I.F. Author"

The story headline is "An Interactive Example".

The Living Room is a room. "A comfortably furnished living room."
The Kitchen is north of the Living Room.
The Front Door is south of the Living Room.
The Front Door is a door. The Front Door is closed and locked.

The insurance salesman is a man in the Living Room. "An insurance salesman in a tacky polyester suit. He seems eager to speak to you." Understand "man" as the insurance salesman.

A briefcase is carried by the insurance salesman. The description is "A slightly worn, black briefcase." Understand "case" as the briefcase.

The insurance paperwork is in the briefcase. The description is "Page after page of small legalese." Understand "papers" or "documents" or "forms" as the paperwork.

Instead of listening to the insurance salesman for the first time:
say "The salesman bores you with a discussion of life insurance policies. From his briefcase he pulls some paperwork which he hands to you."; move the insurance paperwork to the player.

Система программирования не знает заранее смысл терминов “insurance salesman”, “briefcase” и “paperwork” – но способна анализировать грамматику “упрощенного” английского языка и исходя из этого анализа – делать выводы о том, что в этом описании является объектами и что с этими объектами можно сделать – то есть строит описание объектов из описания их отношений.

Фактически, мы уже вплотную подошли к так называемым “экспертным системам” и “искуственному интеллекту”. Вообще, очень популярным в этих системах был язык Lisp, позволявший сравнительно просто (смотри выше ссылку на SICP) описывать новые синтаксические конструкции и в зависимости от библиотеки “становиться чем угодно”. Lisp превращается и в объектно-ориентированный язык с помощью, например, Common Lisp Object System, и в гораздо более интересные вещи. Например, существует проект Cyc (”цик”, от encyclopedia), ставящий своей целью описать “все” знания. Основным языком программирования в Cyc является CycL – фактически, “очень ограниченный” диалект Lisp.

Например, фраза “Билл Клинтон – президент США” может быть записана следующим образом (с помощью предиката Is A – “является”):

(#$isa #$BillClinton #$UnitedStatesPresident)

А вот другой стандартный предикат – Generalises, “обобщает”:

(#$genls #$Tree-ThePlant #$Plant)

“Всякое дерево является растением”.

На CycL описываются, кроме того, некоторые правила логического вывода – которые позволяют использовать эти “знания” и даже отвечать на какие-то вопросы (”Существуют ли негры-президенты США?”). Для того, чтобы построить онтологию (упертый из философии термин, который в “науке” об искуственном интеллекте означает доступную базу знаний), необходимо определить входящие в нее объекты – и они определяются исключительно теми отношениями-фактами, в которые входят. Правда, очень похоже на идеи, высказанные Витгенштейном?

Сразу скажу, что скорее всего, создатели упомянутых программных систем даже не задумывались о том, что придуманные ими языки программирования “реализуют” какие-то философские концепции. Более того, может показаться, что эти “концепции” тут притянуты за уши. В свое оправдание скажу, что любая философская система – это “то, как люди мыслят” – причем, как можно увидеть, “способ мышления” не универсален. Можно начинать “от объектов”, как древнегреческие философы, можно – “от фактов”, в обоих случаях получим некую более-менее адекватную “картину мира”. В зависимости от поставленной задачи представление “мира” в компьютерной программе может быть разным, и “объектно-ориентированное” – далеко не единственное.

Запись опубликована в блоге Шуры Люберецкого. Вы можете оставлять свои комментарии там, используя свое имя пользователя из ЖЖ (вход по OpenID).