Горячее
Лучшее
Свежее
Подписки
Сообщества
Блоги
Эксперты
Войти
Забыли пароль?
или продолжите с
Создать аккаунт
Я хочу получать рассылки с лучшими постами за неделю
или
Восстановление пароля
Восстановление пароля
Получить код в Telegram
Войти с Яндекс ID Войти через VK ID
Создавая аккаунт, я соглашаюсь с правилами Пикабу и даю согласие на обработку персональных данных.
ПромокодыРаботаКурсыРекламаИгрыПополнение Steam
Пикабу Игры +1000 бесплатных онлайн игр
Классический арканоид для любителей ретро-игр. Защитите космический корабль с Печенькой (и не только) на борту, проходя уровни в арканоиде.

Арканоид Пикабу

Арканоид, Аркады, Веселая

Играть

Топ прошлой недели

  • AlexKud AlexKud 38 постов
  • SergeyKorsun SergeyKorsun 12 постов
  • SupportHuaport SupportHuaport 5 постов
Посмотреть весь топ

Лучшие посты недели

Рассылка Пикабу: отправляем самые рейтинговые материалы за 7 дней 🔥

Нажимая кнопку «Подписаться на рассылку», я соглашаюсь с Правилами Пикабу и даю согласие на обработку персональных данных.

Спасибо, что подписались!
Пожалуйста, проверьте почту 😊

Помощь Кодекс Пикабу Команда Пикабу Моб. приложение
Правила соцсети О рекомендациях О компании
Промокоды Биг Гик Промокоды Lamoda Промокоды МВидео Промокоды Яндекс Директ Промокоды Отелло Промокоды Aroma Butik Промокоды Яндекс Путешествия Постила Футбол сегодня

Lisp

11 постов сначала свежее
10
sergeyshpadyrev
sergeyshpadyrev
1 месяц назад
Лига программистов

Лямбда, Лисп и Ложбан — в поисках утраченного Вавилона, или мой проект конструирования симметричного языка. Часть 2⁠⁠

Лямбда, Лисп и Ложбан — в поисках утраченного Вавилона, или мой проект конструирования симметричного языка. Часть 2 Lisp, Программирование, Лингвистика, Длиннопост

В первой части мы рассмотрели лямбда-исчисление Чёрча и язык программирования LISP.

Ложбан

С середины двадцатого века умы всех лингвистов мира занимала гипотеза лингвистической относительности, более известная как гипотеза Сепира-Уорфа. Согласно этой гипотезе язык определяет мышление человека - то есть структура используемого человеком языка влияет на его мировосприятие и его возможности понимания определенных концепций. Например, согласно гипотезе Сепира-Уорфа носитель языка, на котором существует двадцать названий цветов будет эффективнее в некоторых занятиях носителя языка, в котором вполовину меньше названий цветов.

Обычно гипотезу Сепира-Уорфа пытались проверить на аборигенах из малоконтактных племён Южной Америки. Самое известное из подтверждений этой гипотезы - это исследование живущего в Южной Америке племени народа пирахан. Они ведут простую жизнь, их имущество обычно состоит из из горшка, кастрюли, ножа и мачете. В их языке нет числительных, времен и названий цветов, нет и языковой рекурсии, но зато существуют местоимения третьего лица для водоплавающих и неводоплавающих одушевлённых объектов.

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

Пирахан может заинтересовать что-нибудь необычное - например, пролетающий в небе самолет, однако как только тот скрывается из виду, они теряют всякий интерес к произошедшему, и даже не могут ответить на вопрос, видели ли они что-нибудь несколько секунд назад. Исследовавший их на протяжении долгих лет этнолог Дэниэл Эверетт писал, что люди племени пирахан руководствуются исключительно непосредственным опытом - они опираются только на ту информацию, которую получают от своих органов чувств в настоящий момент времени.

Но самым смелым экспериментом по проверке гипотезы лингвистической относительности стали создание на основе идей Лиспа искусственно сконструированного языка межчеловеческого общения Логлан и его открытой версии Ложбан, и попытка понять, влияет ли изучение этого языка на логическое мышление его носителей. Забегая вперёд, можно сказать, что эксперимент провалился, так как учить основанный на математике язык бросились только фанатеющие по математике ботаны с уже довольно специфическим складом ума.

Ложбан основан на идее о том, что любое высказывание естественного языка можно выразить в качестве основанной на математических функциях пропозиции. Это делает Ложбан языком с формальной, непротиворечивой, однозначной грамматикой, которую можно легко распарсить с помощью компьютерной программы.

Основной синтаксической единицей Ложбана служит предикат selbri, в чём-то подобный глаголам русского языка, но не совсем эквивалентный им. Каждый предикат selbri - это как в функция в LISP с определенным количеством определенных аргументов.

Возьмем к примеру klama - глагол "идти". У него пять аргументов:

x1 klama x2 x3 x4 x5
x1 идет от x2 к x3 через x4 используя x5

А у глагола-предиката djica "хотеть" три аргумента:

x1 djica x2 x3
x1 хочет x2 из-за мотива x3

Мы можем использовать только часть аргументов. Например:

mi klama
Я иду

mi klama le zarci
Я иду в магазин

mi klama le zarci le zdani
Я иду в магазин из дома
mi klama le zarci le zdani le bisli
Я иду в магазин из дома по льду

mi klama le zarci le zdani le bisli le karce
Я еду в магазин из дома по льду на машине

Определенный артикль le помогает отсекать аргументы после глагола друг от друга, так как на месте каждого из аргументов может использоваться другое выражение любой степени вложенности. Аргументы можно пропускать и заменять словом zo'e (читается как зо'э):

mi klama zo'e le zdani
Я иду из дома

Каждое высказывание подобное выражение на Ложбане называется bridi. Это аналог S-выражений в Лиспе. Его можно использовать в качестве аргумента в других глаголах-предикатах selbri с помощью частиц рекурсии.

Например, одной из таких частиц является "lo nu":

do klama le zarci
Ты идёшь в магазин

mi djica lo nu do klama le zarci
Я хочу, чтобы ты пошёл в магазин

Для обозначения времен в Ложбане используются частицы, меняющие время предиката:

  • pu - прошлое

  • ca - настоящее

  • ba - будущее

Например:

mi pu klama le zarci
Я шёл в магазин

mi ba klama le zarci
Я пойду в магазин

Преимущества Ложбана состоят в его однозначном синтаксисе. Например, двусмысленность английского предложения "I saw the man with the telescope" невозможна в Ложбане. Кроме того у Ложбана однозначное произношение букв - нет такого, что читается не так как пишется. Также в язык вшиты логические операции И, ИЛИ, НЕ, исключающее ИЛИ, предикаты "все" и "существует хотя бы один", логические построения вроде "если x1, то x2".

Но недостатков у него гораздо больше - немелодичное звучание, похожее на слух на вызов дьявола на смеси польского с арабским, отсутствие внятного словообразования, фиксированное количество аргументов у предикатов-глаголов, да и дикий всё-таки синтаксис. Такой популярности, как у гораздо более приятного уху эсперанто, Ложбан не снискал - он остался неудачным экспериментом лингвистов и математиков по созданию языка общения на основе логики высказываний. Однако зажжённый им маяк остался в сердцах людей.

Если хотите познакомиться с Ложбаном поближе, то лучшее место для этого здесь.

Лиспик

С моей точки зрения, несмотря на то, что у Ложбана есть фатальный недостаток, сама идея сконструировать язык человеческого общения на основе математики не так плоха. Но мне кажется, что имеет смысл начинать не с синтаксиса, а со словообразования. Я уже описывал свою задумку в своём посте "Двоичный код Вселенной и симметричные языки". Сейчас эта задумка оформилась в более-менее стройный план по созданию языка общения под каламбурным названием LISPEAK. Разработка словообразования, морфологии и синтаксиса этого языка будет вестись мною в виде кода на TypeScript в github-репозитории.

Словообразование языка будет основано на функциях. Основную идею этого можно выразить так:

const я = "аб"
const много = (x) => `${x}у`
const мы = много(я); // абу

const шёл = прошлое(иду)
const сделать = законченность(делать)
const сделал = прошлое(законченность(делать))

Cлова будут образовываться согласно симметриям подобно тому как в иврите различные слова образуются подстановкой трёхбуквенного корня в особую форму. К примеру, в иврите корень "спр" означает считать, а корень "хтв" - писать, а корень "фгш" - встречать. Подставляя эти корни в форму "ми12а3", означающую сущность, связанную с подставляемым значением, мы получаем слова "миспар" - "число", слово "михтав" - "письмо" и слово "мифгаш" - встреча. Подобно этому, мы могли бы создать язык, в котором буквенные корни подставляются в две симметричные формы и приобретают противоположные значения.

Далее цитирую самого себя:

Пусть форма "э1э2" означает одну из сторон симметрии, а форма "у1у2" будет означать противоположную сторону, а "и1и2" середину между ними. Подставляя в эти две формы разные корни мы будем формировать словарный запас нашего языка.

Пусть корень "бл" имеет значение, связанное со полом, тогда слово "эбэл" будет обозначать женщину, а слово "убул" мужчину. Пусть корень "рд" имеет значение, связанное с красотой, тогда слово "эрэд" будет обозначать уродливость, а слово "уруд" красоту. Следовательно выражение вроде "эбэл уруд" будет иметь значение "красивая женщина".

Пусть корень "мр" имеет значение связанное с прямым родством, тогда слово "эмэр" будет обозначать ребенка, а слово "умур" родителя. Таким образом, слово "эбэлумур" будет обозначать мать, слово "убулумур" - отца, слово "эбэлэмэр" будет обозначать дочь, а слово "убулэмэр" сына.

Пусть корень "мн" имеет значение, связанное с численностью, тогда слово "эмэн" будет обозначать "один", а "умун" много. Следовательно, слово "эбэлумун" будет обозначать "женщины", а слово "убулумун" - "мужчины".

Пусть корень "вд" имеет значение, связанное со сторонами взаимодействия, тогда слово "эвэд" будет обозначать "субъект", а слово "увуд" будет обозначать "объект". Словом "эвэд" также можно обозначать понятие "я", тогда "мы" будет "эвэдумун" - другими словами "много я".

Пусть корень "рл" имеет значение, связанное с жизнью, тогда слово "эрэл" будет обозначать рождение, слово "урул" будет обозначать смерть, а слово "ирил" - саму жизнь.

Пусть корень "лв" имеет значение, связанное с любовью, тогда слово "эмэн" будет обозначать ненависть, а слово "улув" - любовь. И пусть прибавление "и" на конце слова будет формировать глагол. Тогда слово "элэви" будет иметь значение "ненавидеть", а слово "улуви" будет означать "любить".

Пусть корень "вр" имеет значение, связанное со временем, тогда слово "эвэр" будет обозначать прошлое, "увур" - будущее, а "ивир" - настоящее. Прибавляя эти слова к глаголам мы можем получать прошедшие и будущие времена глагола. Например, выражение "эвэд эвэрулуви" будет обозначать "я любил".

Пусть корень "нл" имеет значение, связанное с отрезком, тогда слово "энэл" будет обозначать начало, слово "унул" - конец, а слово "инил" - середину. Прибавляя "унул" к глаголам мы можем получать совершенные формы глагола. Таким образом, если выражение "эвэд эвэрулуви" имеет значение "я любил", то выражение "эвэд унулэвэрулуви" будет обозначать "я полюбил".

Такое фундаментальное включение понятия симметрии на уровень словообразования может помочь людям осознавать симметричность бытия. Таких симметричных пар и троиц в языке многие сотни. Вот только несколько примеров:

  • верх/низ

  • начало/середина/конец

  • лево/право

  • поражение/ничья/победа

  • писатель/читатель

  • перед/зад

  • любовь/ненависть

  • полезный/вредный

  • добрый/злой

  • свет-тьма

  • быстрый/медленный

  • рано/поздно

  • к/от

  • до/после

  • живой/мертвый

  • целое/часть

  • вход/выход

  • чистый/грязный

  • мы/вы

  • родитель/ребёнок

  • начальник/подчиненный

Более того, возможно это даст возможность встроить в TypeScript-ядро языка математические симметрии - группы из теории групп. Кроме того, я думаю, сделать все окончания в языке на гласную на манер итальянского - так язык получается намного более мелодичным. В общем, сейчас навайбкодю язык и давайте на нём общаться!

P.S.: Больше интересных постов и видео про философию, буддизм и математику вы можете найти в моём телеграм-канале.

Показать полностью
[моё] Lisp Программирование Лингвистика Длиннопост
0
8
sergeyshpadyrev
sergeyshpadyrev
1 месяц назад
Лига программистов

Лямбда, Лисп и Ложбан — в поисках утраченного Вавилона, или мой проект конструирования симметричного языка. Часть 1⁠⁠

Лямбда, Лисп и Ложбан — в поисках утраченного Вавилона, или мой проект конструирования симметричного языка. Часть 1 Математика, Философия, Программирование, Lisp, Длиннопост

Вавилонская библиотека Борхеса

В этом монументальном тексте я постараюсь рассказать вам о трёх непревзойдённых шедеврах XX века - математическом языке лямбда-исчисления, языке программирования LISP и искусственно сконструированном языке человеческого общения под названием "Ложбан", а также о лежащих в их основе общих принципах и идеях. Кроме того, в конце этого поста я представлю вам свой собственный проект по конструированию языка человеческого общения, в основу которого я положил фундаментальные лингвистические симметрии. Мой проект развивает идеи Ложбана и пытается исправить его недостатки, в мессианской надежде отыскать давно утерянный допотопный язык.

Утраченный Вавилон

Лямбда, Лисп и Ложбан — в поисках утраченного Вавилона, или мой проект конструирования симметричного языка. Часть 1 Математика, Философия, Программирование, Lisp, Длиннопост

"Вавилонская башня", Питер Брейгель Старший, 1563 год

В библейском тексте сокрыто огромное количество различных смыслов и символов. В первой главе книги "Бытие", первой книги еврейской Торы и христианского Ветхого Завета, говорится следующее: "В начале сотворил Бог небо и землю". Здесь имеется ввиду не буквальные земля и небо, а что-то совершенно иное. Слово "небо" на иврите пишется как "שמים" (шамаим) и является в мужским множественным числом от слова "שׁם" (шем), означающего "имя". То есть "небеса" на иврите буквально означает "имена". Хотя само слово "имена" в современно иврите использует женское множественное число - "שמות" (шемот).

Под "именами" здесь стоит понимать то, что древнегреческий философ Платон называл миром идей - пространством, где обитают такие вечные и независимые ни от чего идеи как, например, математические равенства 2+2=4, геометрические фигуры, логические конструкции и абстрактные понятия о любви, истине и благе. А под землей в этой строке из Библии подразумевается не почва или планета, а любая материя в целом. Поэтому символический смысл приведённой мною строки таков: "В начале сотворил Бог идеи и материю".

Во второй главе книги "Бытие" Бог дарует сотворенному им человеку Адаму власть давать имена: "Господь Бог образовал из земли всех животных полевых и всех птиц небесных, и привел их к человеку, чтобы видеть, как он назовет их, и чтобы, как наречет человек всякую душу живую, так и было имя ей". Говоря простым языком, человек в иудео-христианской философии - это мост, соединяющий идеальный и материальный миры. С одной стороны, человек может своим разумом выделять абстрактные образы вещей из конкретных материальных предметов - например, как говорил Платон, выделять идею "чашности" из наблюдения за несколькими чашками. С другой стороны, человек может преобразовывать материю по лекалам существующих в идеальном мире форм - например, в уме разработать архитектурный план дома и после возвести строение в физическом мире.

В третьей главе книги "Бытие" Адам вместе со своей женой Евой съедает плод с древа познания Добра и Зла, хотя делать это было строго настрого запрещено ему Богом: "И увидела жена, что дерево хорошо для пищи, и что оно приятно для глаз и вожделенно, потому что дает знание; и взяла плодов его и ела; и дала также мужу своему, и он ел. И открылись глаза у них обоих, и узнали они, что наги, и сшили смоковные листья, и сделали себе опоясания." В символическом плане это означает следующее: с помощью своего ума, люди начали делить всё, что видели на противоположности - добро и зло, свет и тьму, ноль и единицу, чёрное и белое, радость и горе, и на основе этих дуальных противоположностей стали строить более сложные концепции. Даже в приведённом мною отрывке Адам и Ева шьют себе одежду не потому, что им холодно, а потому, что в их головах появилась концепция наготы, а на её основе концепция срамности этой наготы. То есть Адам и Ева начали строить в своём уме то, что французский философ Жан Бодрийяр называл симулякрами. Из реальных материальных предметов абстрагируется идея, на основе этой идеи строится другая концептуальная идея, на основе той идеи строится третья и так далее, и получается копия копий - так называемый симулякр.

Идеальный пример симулякра - это тыквенный латте в Старбаксе. Сначала люди осенью ели созревающие осенью, примерно в октябре, тыквы. Из-за этого тыква стала символом осеннего урожая и скорой смены времени года. Из-за этого Старбакс выпустил свой фирменный тыквенный латте, доступный в продаже тольку осенью, на чашке с которым обычно нарисованы тыквы. Рецепт этого кофе не содержит в себе никаких тыквенных ингредиентов, однако его вкус теперь у большинства клиентов Старбакс теперь накрепко связан именно с тыквами. Таким образом, у нас получается следующая цепочка: реальная материальная тыква -> образ тыквы -> символический образ тыквы как символа осени -> тыквенный латте в Старбаксе -> вкус тыквенного латте. Этот самый вкус тыквенного латте накрепко ассоциируется у людей с тыквами, хотя не имеет к ним никакого отношения вообще. Это копия копий идеи, абстрагированной из реальной материальной тыквы - самый настоящий симулякр. Наказание, постигшее Адама и Еву было ужасно - как писал в своём романе "Трансгуманизм" Виктор Олегович Пелевин: "Слова дали нам власть над миром, но заперли в тюрьме концепций. В этом и заключен смысл библейской метафоры изгнания из рая".

UPD: небольшая поправка к предыдущему абзацу. Оказалось, что из-за жалоб потребителей с 2015 года Starbucks начал добавлять в Pumpkin Spice Latte небольшое количество тыквенного пюре. С 2003 по 2015 год тыквы в составе не было.

Согласно библейскому мифу, после изгнания Адама из рая люди говорили на созданном им языке ещё много поколений, пока не решили построить в древнем Вавилоне огромную башню до неба. Реальным прототипом вавилонской башни стал вавилонский зиккурат Этеменанки, название которого на шумерском языке буквально означает "дом, где сходятся небеса с землёю". За эту наглую и нелепую попытку вернуться в Рай силовым способом разгневанный Бог заставил людей заговорить на разных языках, из-за чего они перестали понимать друг друга, не могли продолжать строительство башни, разделились на различные народы и рассеялись по всей земле. В символическом плане разрушение вавилонской башни стало метафорой неизбежного краха любых попыток постройки единых глобальных структур и проектов из-за того, что разные группы людей слишком сильно отличаются друг от друга в плане менталитета.

Легенда о вавилонской башне вдохновляла людей на творчество во все времена. Нидерландский художник Питер Брейгель Старший посвятил ей одну из своих знаменитых картин, а аргентинский писатель Хорхе Луис Борхес назвал в её честь свой великолепный рассказ про вавилонскую библиотеку.

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

Большинство книг в библиотеке содержат в себе полную белиберду, бессмысленный набор букв. Однако, несмотря на то, что таких книг в библиотеке большинство, также там содержатся все созданные и несозданные человечеством тексты. Согласно рассказу вавилонская библиотека содержит:

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

При этом, является книга осмысленной или нет зависит не только от её содержания, но и от того, кто её читает. Несмотря на общий алфавит обитатели библиотеки говорят на разных языках - одна и та же книга может быть бессмысленным набором букв для одного, и кладезем смыслов для другого. Можно сказать, что современные LLM, большие языковые модели - это своего рода вавилонские библиотекари. При обучении в них загружается все когда либо написанные человечеством тексты, составляющие однако лишь крохотный процент от всех текстов великой библиотеки. А после своего обучения эти нейросети служат нам проводниками по осмысленным её текстам. Но что-то я отвлёкся. Давайте вернемся к основному повествованию.

В этом посте я сначала разберу два по истине существующих в мире чистых идей, Граде Божьем, творения - лямбда-исчисление и созданный на его основе язык программирования LISP. После этого я разберу постройку людьми новой вавилонской башни - сконструированного языка человеческого общения под названием Ложбан - очередную безумную попытку человечества на основе абстрагированных из Града Земного понятий прорваться в Град Божий. Ну а в самом конце, я опишу план своей собственной попытки строительства вавилонской башни - идею сконструированного языка человеческого общения, основанного на симметриях, открытых Адаму и Еве в последствии познания плода древа Добра и Зла. Очевидно, что это попытка также обречена на провал, ведь как писал в своём романе "Маятник Фуко" итальянский писатель Умберто Эко: "Кувыркаясь в своей пустоте, вы можете убеждать себя, будто состоите в общении с Единым. Но как только вы начали возиться с глиной, пускай даже электронной, вы — Демиург. И от этого никуда не деться, а кто собирается сотворить мир, тот неизбежно уже запятнан и ошибками и злом". Но художника такие мелочи останавливать не должны.

Лямбда

Лямбда-исчисление было представлено миру в середине 30-х годов XX-века американским математиком Алонзо Чёрчем, исследовавшим совместно с британским математиком Аланом Тьюрингом возможности вычислимости математических функций. По сути, лямбда исчисление представляет из себя основанный на математической нотации язык программирования, полностью эквивалентный по своим возможностям машине Тьюринга.

В основе лямбда-исчисления лежит великолепная по своей красоте идея:

Всё есть функция

В лямбда-исчислении есть всего две операции - абстракция (объявление функции) и аппликация (применение функции к аргументам). Объявления функций Чёрч записывал с помощью греческой буквы λ (лямбда), которая и дала название всему языку. Например, объявление (абстракция) математической функции f(x)=x+2 на языке лямбда-исчисления записывается как:

f ≡ λx. x + 2

А её применение к числу 3 (аппликация) как:

f 3

На самом деле в лямбда-исчислении нет ни чисел, ни знака плюс, а всё построено исключительно на функциях, но об этом я расскажу чуть позже, а пока что просто показываю вам лямбда-нотацию. Но в целях упрощения повествования в этом посте я буду использовать более понятную большинству из нас JavaScript-подобную нотацию лямбда-функций:

Абстракция

f = (x) => x + 2

Аппликация

f(3)

В лямбда-исчислении вся программа представляет из себя функцию, состоящую из вызовов более мелких функций, которые в свою очередь могут состоять из вызовов ещё более элементарных функций. Исполнение этой программы - это просто вычисление этой грандиозной фрактальной функции на каких-либо входных параметрах.

Например, результатом вычисления следующей программы будет число 22:

f = (x) => x + 2 g = (x) => x * 5 f(g(4))

Кроме того, параметрами в лямбда-исчислении могут служить не только данные, но и другие функции. Например в следующем примере результатом вычисления программы будет число 4:

f = (x) => x + 2 g = (x, y) => x(y) g(f, 2)

В лямбда-исчислении есть две формы эквивалентности - альфа-эквивалентность и бета-редукция. Альфа-эквивалентность утверждает, что два изоморфных выражения можно заменить друг другом. Например:

f = (x) => x + 2 согласно альфа-эквивалентности эквивалентно g = (y) => y + 2

Бета-редукция - это прием замены выражения на результат его вычисления:

((x) => x + 1)(y) согласно бета-редукции эквивалентно (y + 1)

Заменяя постепенно с помощью бета-редукции части программы на их эквиваленты, мы оптимизируем её до самой простой нередуцируемой функции.

Как я уже упомянул в лямбда-исчислении нет ни чисел, ни арифметических операций как базовых элементов языка. Числа в лямбда-исчисления - это тоже функции. Они задаются с помощью так называемого кодирования Чёрча, основанного на арифметике Пеано, в котором все натуральные числа можно составить из всего двух функций - функции 0 и функции next.

0 = (f, x) => x

next = (n) => (f, x) => f(n(f, x))

Соответственно, ряд натуральных выглядит так:

0 = (f, x) => x

1 = next(0) = (f, x) => f(x)

2 = next(1) = next(next(0)) (f, x) => f(f(x))

3 = next(2) = next(next(next(0))) = (f, x) => f(f(f(x)))

А операция сложения соответственно задаётся тоже лямбда-функцией:

plus = (m, n) => (f, x) => m(f, n(f, x))

Можно посмотреть как работает эта система с операцией сложения двух чисел:

result = plus(1, 2)

result = plus((f, x) => f(x), (f, x) => f(f(x)))

result = (f, x) => ((f, x) => f(x))(f, ((f, x) => f(f(x)))(f, x))

result = ((f, x) => f(x))(f, f(f(x)))

result = f(f(f(x)))

Соответственно, согласно альфа-эквивалентности:

result = 3

Подобным же образом в кодировании Чёрча задаются и значения истины и лжи:

true = (x, y) => x

false = (x, y) => y

А также логические операции над ними. Например, вот определение операции логического "И":

and = (p, q) => p(q, p)

Можно посмотреть как работает эта логическая операция:

result = and(true, false)

result = and((x, y) => x, (x, y) => y)

result = ((x, y) => x)((x, y) => y, (x, y) => x)

result = (x, y) => y

Соответственно, согласно альфа-эквивалентности:

result = false

Похожим образом в кодировании Чёрча задаются целые, вещественные и комплексные числа, дроби, операции вычитания, умножения, деления, операции логического "ИЛИ" и "НЕ", строки и все остальные возможные типы и структуры данных, а также операции над ними. Но повествование об этом выходит далеко за рамки этого поста. Могу лишь порекомендовать одно из моих предыдущих эссе под названием "Слово Божие — функциональное программирование как основа Вселенной", в котором более подробно разбираются типы данных в кодировании Чёрча и операции над ними. Кроме того в этом эссе рассказывается как всё кодирование Чёрча можно свести к набору из всего трёх SKI-комбинаторов, а их в свою очередь к одному элементарному йота-комбинатору.

Напоследок лишь скажу, что вместо циклов, широко применяемых в произошедшем из концепции машины Тьюринга императивном программировании, функциональное лямбда-исчисление использует рекурсию - то есть вызов функции самой себя. В чистом лямбда-исчислении функция не может вызвать сама себя по имени. Поэтому для рекурсии используется знаменитый Y-комбинатор неподвижной точки.

Определяется Y-комбинатор так:

Y = (f) => ((x) => f((y) => x(x)(y)))((x) => f((y) => x(x)(y)))

Он позволяет функции вызывать саму себя.

Так как в чистом лямбда-исчислении нельзя сделать что-то типа этого:

f = (x) => f(x) + 1

С помощью Y-комбинатора можно реализовать эту функцию так:

f = Y((self) => (x) => self(x + 1))

Внимание! Эта функция просто пример, а не нечто осмысленное. Она не вычислима, так как рекурсия тут бесконечна.

Лямбда-исчисление стало настоящим прорывом в математике и легло в основу информатики и Computer Science. Знакомство с лямбда-исчислением и кодированием Чёрча помогает людям осознать то, как компьютеры и вычисление работают на самом фундаментальном уровне.

Лисп

Лямбда, Лисп и Ложбан — в поисках утраченного Вавилона, или мой проект конструирования симметричного языка. Часть 1 Математика, Философия, Программирование, Lisp, Длиннопост

Комикс xkcd о Лиспе

Язык программирования LISP был создан в конце 50-х годов XX века американским математиком Джоном Маккарти на основе идей из лямбда-исчисления. LISP - это даже не столько язык программирования, сколько спецификация языка, на основе которой существует целое семейство языков, в которое входят Common LISP, Scheme, Racket, Clojure. В этом посте я буду использовать синтаксис языка Racket - одного из самых современных лиспов.

Для записи выражений Лисп использует префиксную нотацию и круглые скобки. Например, выражение (x + 2 + 3) * (y + 4) в этой нотации будет выглядеть так:

(* (+ x 2 3) (+ y 4))

Как мы помним в лямбда-исчислении есть две основных операции - абстракция и аппликация. В Лиспе абстракция сведена к аппликации функции define к имени выражения и его значению. Например, объявить константу по имени number и значением 1 можно так:

(define number 1)

Записать в константу результат вычисления выражения можно так:

(define result (+ 1 2 3))

Похожим образом объявляются и функции:

(define (square x) (* x x))

Эту же функцию также можно объявить как безымянную лямбда-функцию:

(lambda (x) (* x x))

В таком виде её удобно прокидывать в качестве аргумента в другие функции. Однако лямбда-функции можно дать имя:

(define square (lambda (x) (* x x)))

А после использовать как:

(define squareOfTwo (square 2))

Основной структурой данных в Лиспе служит список. Задать его можно простым способом:

(define numbers (list 1 2 3))

Но на самом деле, функция list - это синтаксический сахар. В своей основе списки в Лиспе представляют из себя бинарные деревья, задающиеся принимающей два аргумента функцией cons и функцией nil (в Racket nil называется empty), обозначающей конец списка. Предыдущее выражение раскрывается в следующую конструкцию:

(define numbers (cons 1 (cons 2 (cons 3 empty))))

Во внутреннем представлении LISP-интерпретатора любое выражение представляет из себя S-выражение - список операций и их аргументов. Каждое S-выражение всегда возвращает какое-либо значение, если оно вычислимо. И каждое S-выражение можно подставить в качестве аргумента в другое S-выражение. Например, выражение (* 2 (+ 3 4)) в виде S-выражения внутри LISP-интерпретатора будет выглядеть подобным образом:

Лямбда, Лисп и Ложбан — в поисках утраченного Вавилона, или мой проект конструирования симметричного языка. Часть 1 Математика, Философия, Программирование, Lisp, Длиннопост

Внутренняя структура S-выражения (* 2 (+ 3 4))

Использование S-выражений позволяет представлять сам код LISP-программы в виде списка, то есть в виде данных, а значит и работать с ним как с данными. Благодаря этому в Лиспе мощнейшая система макросов. Каждый макрос представляет из себя функцию, на вход которой подаётся синтаксическое дерево других функций и выражений, а на выходе получается код новой функции или выражения.

Например, можно задать функцию unless, обратную обычному if:

(define-syntax-rule (unless condition body ...) (if (not condition) (begin body ...)))

Его использование:

(define x 0)

(unless (> x 0) (displayln "x is not positive"))

Кажется, что его использование не отличается от того случая, если бы мы задали unless не в виде макроса, а в виде функции. Отличие в том, что макрос unless раскрывается в код на этапе компиляции, а не в рантайме.

LISP - функциональный язык программирования, основанный на лямбда-исчислении. Поэтому в нём в отличии от императивных языков, основанных на машине Тьюринга, нет понятия переменных и констант. Все объявления именованных выражений в Лиспе - это именно присвоение имени какому-либо выражению. Поэтому все данные в Лиспе иммутабельные, то есть неизменяемые. Благодаря этому все функции в LISP математически чисты - то есть, при одних и тех же входных аргументах они всегда возвращают одни и те же значения. Это даёт программисту на LISP множество преимуществ - простоту дебаггинга, возможность композиции функций, мощнейшую выразительность языка.

Главным учебником по Лиспу вот уже долгие годы является выпущенный в MIT много лет назад учебник SICP - "Structure and interpretation of computer programs" - "Структура и интерпретация компьютерных программ". На этом учебнике выросло несколько поколений программистов.

Под вдохновением от лямбда-исчисления и языка LISP было создано множество других прекрасных инструментов и языков программирования. Унаследованные концепты и идеи лежат в основе языка программирования JavaScript, редактора кода Emacs и операционных систем Unix:

  • Лямбда-исчисление - все есть функция

  • LISP - все есть список

  • Emacs - все есть атомарная команда (даже например, передвижение курсора влево)

  • Unix - все есть файл

  • JavaScript - все есть объект-хешмапа (JS создавался его автором Бренданом Эйхом как "Scheme в браузере" и унаследовал от LISP очень многое).

Когда-то давно под LISP даже создавали специализированные компьютеры - лисп-машины:

Лямбда, Лисп и Ложбан — в поисках утраченного Вавилона, или мой проект конструирования симметричного языка. Часть 1 Математика, Философия, Программирование, Lisp, Длиннопост

Одна из первых лисп-машин

С Лиспом меня связывает глубоко личная история. Долгие годы я пытался создать свой собственный идеальный язык программирования. Я брал за основу разные языки программирования и, как скульптор высекающий из камня прекрасную статую, начинал создавать из взятого за основу языка свой идеал, постепенно улучшая каждый из определенных мною параметров качества. И какой бы язык я не брал за основу, в конце-концов после улучшений и отсечения всего лишнего я всегда получал одно и то же - LISP.

Во второй части я описываю два проекта сконструированных языка общения - Ложбан и Лиспик.

P.S.: Больше интересных постов и видео про философию, буддизм и математику вы можете найти в моём телеграм-канале.

Показать полностью 4
[моё] Математика Философия Программирование Lisp Длиннопост
0
4
bachneverdie
1 год назад

Вопрос про LISP программирование⁠⁠

Уважаемые программисты, хочу спросить у вас совета. Я учусь в музыкальной консерватории, и сейчас пишу статью о сочинении Тристана Мюрая "Contes cruels". В интервью автор говорит что "форма произведения похожа похожа на серию "сказок" вложенных друг в друга как в "Тысяча и одной ночи" или как в фрагменте LISP программирования".
Поскольку LISP программирование очень далеко от той сферы которой я занимаюсь, я и обратился к вам. Может быть кто-то может мне помочь и объяснить в двух словах что это может значить?
Заранее благодарю.

Lisp Академическая музыка Текст
8
Партнёрский материал Реклама
specials
specials

Считаете себя киноманом 80 LVL?⁠⁠

Залетайте проверить память и сообразительность → Будет интересно

Киногерои Тест Текст
23
sergeyshpadyrev
sergeyshpadyrev
1 год назад
Лига программистов

Слово Божие — функциональное программирование как основа Вселенной⁠⁠

Слово Божие — функциональное программирование как основа Вселенной Lisp, Бог, Yota, Философия, Платон, Длиннопост

Господь сотворяет Вселенную

Миру присуще непостоянство: рождаются и умирают люди, строятся и разваливаются государства, появляются и исчезают целые цивилизации. Время, подобно олицетворяющему его древнегреческому богу Кроносу, пожирает собственных детей. Почти все языки программирования, созданные человечеством на заре компьютерной эры, не дожили до наших дней. Противостоять неумолимому течению реки времени смог только один из самых древних языков - LISP.

Его выживание - не простая удача, а следствие того факта, что LISP воплощает в себе фундаментальные принципы программирования, математики и, как вам станет ясно из этого поста, самого бытия. Создатель объектно-ориентированного программирования Алан Кей назвал LISP величайшим из когда-либо созданных языков программирования, а многие другие программисты с особым религиозным трепетом величают его не иначе как "язык Бога".

Я и сам долгие годы пытался создать идеальный язык программирования. Я брал за основу разные языки программирования и, как скульптор высекающий из камня прекрасную статую, отсекал от них всё лишнее, постепенно делая их всё более немногословными, целостными и мощными. Но какой бы язык я не брал за основу, в конце концов после отрезания всего лишнего я всегда получал один и тот же результат - LISP.

Оригинальный LISP был создан американским математиком Джоном Маккарти в конце 50-х годов XX века в качестве "физического" воплощения идей лямбда-исчисления - формального математического аппарата для описания вычислений, разработанного другим американским математиком - Алонзо Чёрчем. Идея лямбда-исчисления лежит в основе всей концепции функционального программирования, а LISP является эталонной реализацией этой концепции.

Суть функционального программирования можно изобразить в виде довольно простой схемы:

Данные -> Функция -> Данные

Данные - это представленные в виде последовательности битов числа, строки, значения истина/ложь, списки. Функция - это описанная математическим равенством зависимость выходных данных от одних или нескольких входных данных.

Примеры данных:

13

"Hello"

true

[1, 2, 3]

Пример функции:

y = x + 1

Основной постулат функционального программирования утверждает, что функции должны быть чистыми - то есть не иметь внутреннего состояния и всегда выдавать одинаковые выходные значения на одинаковые входные параметры. Как функция y=x+1 всегда выдает выходное значение y=3 при входном параметре x=2. Кроме того, в функциональном программировании не принято перезаписывать данные под одним и тем же именем - все данные определяются в виде констант:

// Переменная a - в функциональном программировании делать так нельзя

a = b + 1

a = a + 3

// Константа a - в функциональном программирование нужно делать так

a = b + 1

с = a + 3

Математическая функция - не материальный объект, а бесплотная идея. Древнегреческий философ Платон считал, что наш физический мир представляет из себя лишь блёклую тень мира идей, освещаемых божественным светом. В материальном мире умирают люди, рушатся империи, погибают даже галактики, но два плюс два всегда без исключения равно четырём. Так было, так есть и так будет - эту вечную бессмертную идею никому не под силу изменить, она существует независимо от чего бы то ни было.

В пример вечности и независимости математических идей Платон обычно приводил правильные многогранники, которые теперь в его честь часто называют платоновыми телами. Правильный многогранник - это трехмерная геометрическая выпуклая фигура, состоящая из одинаковых многоугольников с равными сторонами. Ещё во времена Платона было доказано, что таких многогранников существует только пять: тетраэдр, гексаэдр (куб), октаэдр, додекаэдр и икосаэдр - даже могущественные олимпийские боги не в силах создать шестой. Такая независимость математических идей от воли людей и богов, по мнению Платона, доказывала то, что идеи - это самостоятельные объекты, существующие в своем особом "мире" идей.

Слово Божие — функциональное программирование как основа Вселенной Lisp, Бог, Yota, Философия, Платон, Длиннопост

Платоновы тела

Другой излюбленный пример Платона, иллюстрирующий его учение о материальном мире как тени мира идей - рассмотрение круга. Мы можем взять лист бумаги с карандашом и нарисовать множество кругов. Ни один из них не будет совершенно круглым, каждый будет чуточку отличаться от другого - то дрогнет рука, то движение недостаточно точное. Если мы попытаемся выточить круглый предмет на станке, то тоже не получим двух полностью одинаковых предметов. У каждого станка есть погрешность обработки - тут и там один кругляшок будет на пару микрометров отличаться от другого. Однако несмотря на то, что ни один материальный круг не совершенен, в каждом из них мы видим воплощение некого идеального круга. Поэтому можно сказать, что материальные круглые предметы - это тень идеи круга. Точно так же можно рассуждать о чем угодно другом: так, например, все столы в мире немного отличаются друг от друга, но все без исключения являются тенью идеи стола.

Ученик Платона, столь же знаменитый как и его учитель, философ Аристотель рассматривал мир под другим углом. В его картине мира идеи - это формы, которые придают материи определенный вид, превращают вещество в вещи. Идея стола как бы "склеивает" молекулы вещества, превращая их в материальный стол. Аристотелевскую связь между идеями и материей довольно просто понять на примере знаменитого философского парадокса корабля Тесея.

Согласно древнегреческой легенде, корабль, на котором мифологический герой Тесей вернулся с Крита после победы над Минотавром, использовался афинянами для ежегодного паломничества на остров Делос. Перед каждым плаванием корабль чинили, заменяя часть прогнивших досок на новые. Спустя какое-то время все старые доски корабля были заменены на новые. Среди людей разгорелся спор: тот же этот корабль, на котором плавал Тесей, или уже другой - новый?

Слово Божие — функциональное программирование как основа Вселенной Lisp, Бог, Yota, Философия, Платон, Длиннопост

Первая проблема корабля Тесея

За годы ремонта в корабле не осталось ни одного атома вещества от первоначального корабля - материя уже другая, но идея, форма, скрепляющая эти атомы вместе всё та же. Множество мыслителей со времен античности и до наших дней спорили о том, можно ли считать корабль в таком случае тем же самым или нет. Сперва может показаться, что ответ прост - корабль тот же самый, ведь его идея осталась той же. Но тогда возникает другой вопрос: если бы старые доски сохранили и сколотили из них второй корабль, то какой из этих двух кораблей был бы настоящим и почему?

Слово Божие — функциональное программирование как основа Вселенной Lisp, Бог, Yota, Философия, Платон, Длиннопост

Вторая проблема Тесея

Сравнивая функциональное программирование с древнегреческой философией, можно сказать, что функции подобны бесплотным идеям, а данные подобны "твёрдой" материи. Мир - это поток преобразования материи через "формы" идей, а программа на LISP - это поток преобразования данных через вызов цепочки функций.

Похожее соответствие обнаружили физики при исследовании законов микромира. В своем поведении элементарные частицы проявляют удивительное свойство корпускулярно-волнового дуализма. Пока какое-либо состояние элементарной частицы, например её положение в пространстве, не измерено, его изменение носит вероятностный характер, однако эта вероятность строго подчиняется волновому уравнению Шрёдингера. Когда же это состояние подвергается измерению, то результат измерения показывает одно, выбранное абсолютно случайным образом из вероятных, значение данного состояния.

Получается, что пока состояние не измерено, мы рассматриваем элементарную частицу как бесплотную идеальную волну вероятности, а когда оно измеряется, то мы рассматриваем её в определенном моменте времени как "твёрдую" материальную частицу-корпускулу с определенным значением этого состояния. Другими словами, волновое уравнение Шредингера - это функция, существующая в мире математических идей с встроенным рандомом, а частица - это данные полученные при вызове этой функции Шрёдингера. Волна из мира идей отбрасывает тень на материальный мир в виде частицы.

Слово Божие — функциональное программирование как основа Вселенной Lisp, Бог, Yota, Философия, Платон, Длиннопост

Временная эволюция вектора состояния: гладкая унитарная эволюция U (в соответствии с уравнением Шредингера), перемежаемая с разрывной редукцией R вектора состояния. Иллюстрация из книги Роджера Пенроуза "Новый ум короля"

Бесплотные идеи в философии Аристотеля придают форму материи, бесплотные волны в квантовой механике задают вероятность обнаружения определенного состояния частицы при измерении, а бесплотные функции в программировании преобразуют данные. Из этого так и тянет сделать вывод, что этот дуализм духа и плоти во Вселенной фундаментален. Однако это не совсем так. Восточные философские учения, такие как буддизм и адвайта-веданта, учат тому, что мир по своей природе не двойственен, а кажущиеся противоположности иллюзорны. Мы можем убедиться в этом сами, попробовав разбить на части пирамиду абстракций, которую мы называем материей.

Рассмотрим какой-нибудь материальный предмет: например, яблоко. Яблоко - это существующая исключительно у нас в уме абстракция совокупности различных его частей - кожуры, мякоти, семян, кусочка веточки. Каждая часть яблока в свою очередь - это абстракция над совокупностью клеток и происходящих между ними биологических процессов. Каждая клетка в свою очередь - это абстракция над совокупностью молекул различных соединений и происходящих между ними химических процессов. Молекула в свою очередь - это абстракция над совокупностью атомов и происходящих между ними физических процессов. Атом в свою очередь - это абстракция над совокупностью элементарных частиц и происходящих между ними квантовомеханических процессов. Можно ли считать элементарные частицы базовыми твёрдыми "кирпичиками" Вселенной?

Тщательное исследование поведения элементарных частиц в начале и середине XX века показало, что представление об элементарных частицах как о микроскопических "шариках" совершенно неверно. Например, частицы не имеют определенного положения в пространстве, а скорее имеют вероятность оказаться в какой-то точке пространства - положение в пространстве становится фактом только в момент измерения в конкретный момент времени, а после измерения положение опять становится вероятностным. Кроме того, принципиально невозможно одновременно измерить в один момент времени положение частицы в пространстве и её скорость.

Модель атома в виде точечных частиц, вращающихся по орбитам вокруг ядра в центре тоже оказалась неверной. Вместо этого оказалось, что электроны в атоме представляют собой скорее вероятностное облако вокруг ядра. Американский физик Роберт Оппенгеймер так описывал поведение электрона в атоме:

Если спросят, постоянно ли его положение, нужно сказать "нет", если спросят, меняется ли оно со временем, нужно сказать "нет". Если спросят, неподвижен ли он, нужно сказать "нет", если спросят, движется ли он, нужно сказать "нет"

Также оказалось, что мы не можем ничего сказать об элементарной частице, кроме числовых значений нескольких характеристик, проявляющих себя при её взаимодействии с другими частицами: массы, заряда, спина и нескольких других. Получается, что элементарная частица - это просто математическая абстракция, описывающая временной срез некоторого физического процесса.

При близком рассмотрении материя не просто "склеена" идеями, она, оказывается, буквально "соткана" из них. Наш мир - не тень мира идей, наш мир - буквально и есть мир идей. И точно так же, как при рассмотрении материи мы обнаруживаем, что она состоит из идей, американский математик Алонзо Чёрч при рассмотрении различных типов данных обнаружил, что они состоят из функций. Это великое открытие показало, что на фундаментальном уровне нет никакого разделения: ни между идеями и материей, ни между волнами и частицами, ни между данными и функциями. Всё это - разные проявления одного и того же.

Лямбда

Алонзо Чёрч разработал минималистичную формальную систему для записи математических функций под названием "лямбда-исчисление", названного так в честь использующейся в ней греческой буквы "лямбда". В лямбда-исчислении существует всего две операции: абстракция и аппликация. Абстракция, обозначающаяся той самой лямбдой - это объявление функции, а аппликация - это применение функции к некоторым параметром.

Функция y=x+1 в лямбда-исчислении будет записана в виде абстракции как:

y = λx.x+1

Применение этой функции к числу два будет записано в виде аппликации как:

z = y 2

Однако, по причине привычности большинства из нас к совершенно другой нотации объявления и аппликации функций в этом посте для удобства я буду использовать JavaScript-нотацию лямбда-функций.

Функция y=x+1 в JavaScript-нотации будет записана в виде абстракции как:

y = (x) => x + 1

Применение этой функции к числу два будет записано в виде аппликации как:

z = y(2)

Исследуя возможности лямбда-исчисления, Чёрч обнаружил, что с помощью одних только операций абстракции и аппликации можно выразить программу любой сложности, оперирующую любыми типами данных. Для этого Чёрч представил все типы данных в виде функций - позже такое представление стало именоваться кодированием Чёрча.

Рассмотрим для начала логику.

Булев тип данных, истину и ложь, можно представить в виде функций таким образом:

true = (x, y) => x

false = (x, y) => y

После мы можем определить в виде функций базовые логические операции:

and = (p, q) => p(q, p)

or = (p, q) => p(p, q)

not = (p) => (x, y) => p(y, x)

if = (p, x, y) => p(x, y)

Посмотрим как работает получившаяся система:

result1 = and(true, false)

// подставляем значения true и false в виде функций

result1 = and((x, y) => x, (x, y) => y)

// подставляем параметры в значение and в виде функции

result1 = ((x, y) => x)((x, y) => y, (x, y) => x)

// применяемая функция возвращает первый параметр, то есть

result1 = (x, y) => y

// сравнив эту функцию с нашими двумя логическими значениями, мы понимаем, что

result1 = false

result2 = or(true, false)

// подставляем значения true и false в виде функций

result2 = or((x, y) => x, (x, y) => y)

// подставляем параметры в значение or в виде функции

result2 = ((x, y) => x)((x, y) => x, (x, y) => y)

// применяемая функция возвращает первый параметр, то есть

result2 = (x, y) => x

// сравнив эту функцию с нашими двумя логическими значениями, мы понимаем, что

result2 = true

result3 = not(true)

// подставляем значение true в виде функции

result3 = not((x, y) => x)

// подставляем параметры в значение not в виде функции

result3 = (x, y) => ((x, y) => x)(y, x)

// применяемая функция возвращает первый параметр, то есть

result3 = (x, y) => y

// сравнив эту функцию с нашими двумя логическими значениями, мы понимаем, что

result3 = false

result4 = if(false, 1, 2)

// подставляем значение false в виде функции

result4 = if((x, y) => y, 1, 2)

// подставляем параметры в значение if в виде функции

result4 = ((x, y) => y)(1, 2)

// применяемая функция возвращает второй параметр, то есть

result4 = 2

Используя арифметику Пеано, можно выразить с помощью функций даже числа. Для этого нужно задать две базовые функции:

0 = (f, x) => x

next = (n) => (f, x) => f(n(f, x))

После этого мы можем выразить все числа через эти две функции:

0 = (f, x) => x

1 = (f, x) => f(x)

2 = (f, x) => f(f(x))

3 = (f, x) => f(f(f(x)))

...

Точно так же можно определить и арифметические операции:

plus = (m, n) => (f, x) => m(f, n(f, x))

multiply = (m, n) => (f, x) => m(n(f), x)

Посмотрим как работает получившаяся система:

result5 = plus(1, 2)

// подставляем значения 1 и 2 в виде функций

result5 = plus((f, x) => f(x), (f, x) => f(f(x)))

// подставляем параметры в значение plus в виде функции

result5 = (f, x) => ((f, x) => f(x))(f, ((f, x) => f(f(x)))(f, x))

// упрощаем выражение

result5 = ((f, x) => f(x))(f, f(f(x)))

// упрощаем выражение еще раз

result5 = f(f(f(x)))

// сравнив эту функцию с нашими числами, мы понимаем, что

result5 = 3

Подобным образом любые типы данных, включая даже строки и списки, можно определить через функции. Ещё более удивительно то, что эту систему можно упростить, выразив все возможные функции в виде комбинации всего трёх элементарных функций. Занимающаяся этим область математики под названием комбинаторная логика была разработана российским математиком Моисем Исаевичем Шейнфинкелем и развита американским математиком Хаскеллем Карри. В честь последнего был назван один из самых известных функциональных языков программирования Haskell и операция каррирования.

Комбинаторная логика позволяет выразить любую функцию в виде бинарного дерева, узлы которого представляют из себя одну из трёх функций, называющихся комбинаторами:

I = (x) => x

K = (x, y) => x

S = (x, y, z) => x(z, y(z))

Названия I, K, S означают identity (тождество), konstant (постоянная) и substitution (подмена) соответственно. Попробуем свести к SKI-исчислению булеву логику, описанную нами выше в виде лямбда-исчисления:

true = K

true = (x, y) => x

false = S(K)

false = (x, y) => K(y, x(y))

false = (x, y) => y

После мы можем определить через SKI-комбинаторы логические операции.

Логическое "и" определяется в виде передачи в функцию истины/лжи false последним параметром:

and = false

true(true, and) = true(true, false) = K(true, false) = true

true(false, and) = true(false, false) = K(false, false) = false

false(true, and) = false(true, false) = K(false, true(false)) = false

false(false, and) = false(false, false) = K(false, false(false)) = false

Логическое "или" определяется в виде передачи в функцию истины/лжи true первым параметром:

or = true

true(or, true) = true(true, true) = K(true, true) = true

true(or, false) = true(true, false) = K(true, false) = true

false(or, true) = false(true, true) = K(true, true(true)) = true

false(or, false) = false(true, false) = K(false, true(false)) = false

Логическое "не" определяется в виде передачи в функцию истины/лжи параметров false, true:

true(false, true) = K(false, true) = false

false(false, true) = K(true, false(true)) = true

Точно так же с помощью SKI-комбинаторов можно выразить и все остальные типы данных, представленные в виде кодирования Чёрча, но к сожалению описание этих операций выходит далеко за пределы этого поста.

Йота

В начале было Слово, и Слово было с Богом, и Слово было Бог
Евангелие от Иоанна

Согласно этой известной строке из евангелия, Господь сотворил мир, окликнув его из небытия своим словом. Что же это было за слово, обладающее могуществом породить целую Вселенную?

В еврейской Торе создатель мира упоминается под множеством различных имён, но только одно из них считается его личным именем, а не титулом. Это имя записывается как יהוה, но обычно не читается, так как согласно традициям евреи должны соблюдать одну из основных заповедей - "не упоминай имени моего всуе". Точное произношение этого имени, известного как тетраграмматон, утеряно в веках, но обычно в западной традиции его произносят как Яхвэ или Иехова/Иегова. Слово יהוה объединяет в себе три времени глагола "быть", его можно перевести как "был, есть и будет".

Первая буква личного имени Бога י в еврейском и родственном ему финикийском алфавите называется "йуд". В греческом алфавите, перенятом древними греками с некоторыми усовершенствованиями у финикийцев, соответствующая буква носит название "йота". Йуд и йота записываются в виде коротенького штриха - это самые маленькие буквы в письменных алфавитах греков и евреев, обозначающие самый короткий звук "й".

Именно из-за своего малого размера буква "йота" была выбрана американским лингвистом Крисом Баркером для обозначения самого минимального из возможных комбинаторов - универсального йота-комбинатора, с помощью которого можно выразить I, K и S-комбинаторы, а соответственно и все возможные функции.

Для начала выразим функцию I через S и K:

// Первый вариант

I = S(K, K)

I = (x) => K(x, K(x))

I = (x) => x

// Второй вариант

I = S(S, K, K)

I = S(K, K(K))

I = S(K, K) I = x => K(x, K(x))

I = x => K(x, x)

I = x => x

После введем оператор ι и выразим его через S и K:

ι = (x) => x(S, K)

При подстановке вместо S и K их полных значений получаем:

ι = (x) => x((a,b,c) => a(c, b(c)), (d, e) => d)

Теперь мы можем выразить сами SKI-комбинаторы исключительно через йоту:

I = ι(ι)

K = ι(ι(I))

K = ι(ι(ι(ι)))

S = ι(ι(ι(I)))

S = ι(ι(ι(ι(ι))))

Так как с помощью SKI-комбинаторов можно выразить любую возможную функцию, а сами комбинаторы можно выразить через йоту, то получается, что любую возможную функцию можно выразить через йоту. А значит йота - это то самое Слово, с помощью которого можно сотворить целую Вселенную. Господь в откровении Иоанна Богослова говорит "Я есмь Альфа и Омега", но разве не правильнее ли будет сказать "Я есмь Йота и Лямбда"?

В первой строке книги Бытия сказано:

В начале сотворил Бог небо и землю

Вероятно, на эту строку Библии сильно повлияла космогоническая литература аккадцев - родственного древним евреям семитского народа. Даже мифический первый еврей Авраам был родом из месопотамского города Ур, располагавшегося в междуречье Тигра и Ефрата и бывшего одним из центров шумеро-аккадской цивилизации.

В аккадском космогоническом мифе Энума Элиш говорится:

Когда наверху не названо небо, внизу земля именем не называлась

Эта строка проливает свет на значение первой строки книги Бытия. Получается, что Бог для сотворения мира своим Словом именует противоположности, тем самым отделяя бытие от небытия, жизнь от смерти, движение от покоя, единицу от нуля, материю от идей, частицу от волны, данные от функции. Особенная мистическая красота заключается в том, что в созданном на основе йота-исчисления языке программирования Iota любая программа тоже состоит из всего двух символов: нуля и единицы. Ноль кодирует открывающуюся скобку, а единица йоту.

Пример программы на языке Iota:

0011011

При замене нуля на открывающуюся скобку, а единицы на йоту получаем:

((ιι(ιι

Это выражение аппликации с закрывающимися скобками записанное в лямбда-нотации выглядит следующим образом:

((ιι)(ιι))

Во всей статье вместо лямбда-нотации я использовал более привычную большинству JavaScript-нотацию. В ней это выражение будет выглядеть так:

(ι(ι))(ι(ι))

Йота - это тьюринг-полный язык, на котором можно написать программу любой сложности. Однако лучшие мыслители человечества всё ещё бьются над решением важного философского вопроса: "Но зачем?".

Вселенная как программа на LISP

У идеалистической философии Платона до сих пор много поклонников. Особенно много их среди математиков. Известно, что убежденным сторонником платонизма был великий немецкий логик Курт Гёдель. Среди наших же современников два самых известных платоника - это астрофизик Макс Тегмарк и математик-программист Стивен Вольфрам.

В своей книге "Наша математическая Вселенная" профессор Тегмарк излагает свои оригинальные взгляды на фундаментальные основы физики. Его картина мира исходит из того, что всё, что нам известно об элементарных частицах - это то, как эти частицы проявляют себя во взаимодействии с другими частицами и то, что их поведение подчиняется волновому уравнению Шрёдингера. Если зайти на Википедию в статьи про электрон и нейтрино, то можно увидеть, что всё чем отличаются эти частицы друг от друга - это числовые значения нескольких характеристик: массы, электрического заряда, цветового заряда, спина, лептонного и барионного чисел и нескольких других. Тегмарк утверждает, что мы можем придумать для себя любые словесные описания физических процессов, но в конце концов всё наше представление о них сводится к одному - числам и формулам. А раз ничего другого кроме формул и чисел мы о Вселенной содержательно сказать не можем, то стоит заключить, что наша Вселенная - это просто огромная математическая структура.

Мысли Тегмарка развил и дополнил создатель пакета Mathematica программист Стивен Вольфрам. По его мнению, мир представляет из себя не просто математическую структуру, а скорее циклический процесс вычисления преобразований математической структуры по некоторому простому правилу. Пользуясь религиозной метафорой, можно сказать, что с точки зрения Вольфрама Бог при сотворении Вселенной задал всего две вещи - начальное состояние некоего графа и правило, по которому этот граф изменяется.

Возможно, существует бесконечное количество комбинаций различных начальных состояний и правил, но только в некоторых из них возможно появление сложных структур и жизни. Примером такого простого правила с простыми начальными условиями, порождающими сложные структуры, может служить знаменитая игра "Жизнь" Джона Конвея.

Согласно размышлениям Вольфрама, наша Вселенная - это один гигантский бесплотный компьютер, который рекурсивно вычисляет все возможные программы, все возможные алгоритмы. А мы можем добавить, что запрограммирован этот компьютер, наверняка, на языке Бога - языке универсального йота-комбинатора, языке SKI-комбинаторов, языке лямбда-исчисления Чёрча, на LISP-е.

UPD:

Больше интересных постов и видео про философию, буддизм и математику вы можете найти в моём телеграм-канале.

Показать полностью 4
[моё] Lisp Бог Yota Философия Платон Длиннопост
7
23
Timeweb.Cloud
Timeweb.Cloud
1 год назад
IT минувших дней
Серия Памятные даты

96 лет со дня рождения Джона Маккарти⁠⁠

  • Автор: Albert_Wesker

  • Оригинальный материал

«Не вижу в человеческом интеллекте ничего такого, что бы человечество не могло бы понять».

Джон Маккарти — фигура, без преувеличения, легендарная. Создатель термина “искусственный интеллект”, основоположник функционального программирования и создатель языка LISP… Список можно продолжать долго.

96 лет со дня рождения Джона Маккарти Познавательно, IT, Lisp, Искусственный интеллект, Timeweb, Длиннопост

Мы сегодня хотим остановиться на одном из значимых эпизодов в жизни Маккарти — его многолетней дружбе с Андреем Петровичем Ершовым. Их переписка и совместная работа во времена, когда американец и советский гражданин находились по разные стороны баррикад — яркий пример того, что для настоящей науки и её последователей нет никаких границ.

Андрей Ершов и Джон Маккарти впервые встретились осенью 1958 года на международном симпозиуме «Механизация процессов мышления» в Теддингтоне (Англия). Для Ершова это была первая поездка в «капиталистические страны» в составе советской делегации с работой «Программирующая программа для БЭСМ». На секциях по программированию молодой советский специалист оказался в компании будущих легенд американской информатики: Грейс Хоппер, Марвина Мински и Джона Бэкус, но главным событием, вошедшим в историю искусственного интеллекта, было выступление Джона Маккарти «Programs with Common Sense» – программы со здравым смыслом. На симпозиуме Ершов и Маккарти, ученые с похожими сферами интересов, договорились об обмене опытом.

96 лет со дня рождения Джона Маккарти Познавательно, IT, Lisp, Искусственный интеллект, Timeweb, Длиннопост

Семь лет спустя, в 1965 году, Ершов отправился в путешествие по Америке, там, в Стэнфорде, открывшем одним из первых самостоятельный факультет информатики, и состоялась следующая личная встреча ученых. Именно после этой поездки между двумя увлеченными увлеченными учеными и завязалась активная переписка, а Маккарти тогда выразил искреннее желание посетить сибирский Академгородок.

Уже осенью 1965 года Маккарти впервые прибыл в СССР. К 1971 году Маккарти побывал в Советском Союзе семь раз: в 1964, 1965, 1966, 1967 (дважды), 1968 и в 1970 годах. Пять из семи визитов он жил в новосибирском Академгородке и наверняка останавливался в единственной гостинице, принимавшей иностранных гостей, «Золотая Долина», которая так поэтично называлась в честь осеннего сибирского леса и долины, где разместился Город Науки.

В одну их этих поездок в дело вмешалась история. Маккарти тогда собирался провести 1968-1969 академический год в Вычислительном Центре Новосибирского Академгородка. К июлю 1968-го года он тщательно спланировал свое путешествие по Европе с дочерью-школьницей Сюзи, и к концу августа хотел прибыть в Москву. К 19 августа Маккарти получил советскую визу и сообщил уточненную дату приезда — 8 сентября.

Но 21 августа советские войска вошли на территорию Чехословакии, и Маккарти телеграфировал Ершову из Эдинбурга, где находился в то время:

«Из-за международной обстановки я задерживаюсь и сокращаю свой визит. Я могу приехать в Новосибирск на один, может, на два месяца с 1-го ноября. Сюзи не приедет. Если вы все еще хотите принять меня, отвечайте сюда».


В такой напряженной обстановке Маккарти не хотел подвергать дочь риску, ведь в любой момент могла начаться война.

Получив телеграмму, Ершов немедленно ответил, что Вычислительный Центр согласен принять Маккарти в любое время. В письме, датированном тем же днем, 11 сентября, Ершов писал:

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


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

Последняя их встреча состоялась в Академгородке летом 1987 года, за год до кончины Ершова. Андрей Петрович пригласил легендарного ученого встретиться с юными советскими программистами в Летней школе и рассказать им о своем видении достижений и проблем искусственного интеллекта.

96 лет со дня рождения Джона Маккарти Познавательно, IT, Lisp, Искусственный интеллект, Timeweb, Длиннопост

С благодарностью вспоминали впоследствии советские школьники те Летние Школы, на которых летело время в обсуждении различных задач — от трудных «школьных» до проблем, связанных с областью искусственного интеллекта.

96 лет со дня рождения Джона Маккарти Познавательно, IT, Lisp, Искусственный интеллект, Timeweb, Длиннопост

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

Научная часть письма посвящена также и критике Алгола, обсуждению состояния и перспектив этого международного проекта, привлекшего к участию и Маккарти, и Ершова.

Но самая важная научная часть письма – краткое изложение взглядов Маккарти на программы как математические объекты.

«Я считаю, – писал Маккарти, – что цель ближайших 5-10 лет – развить математическую теорию вычислений и доказательные программы, которые дадут их пользователю возможность требовать доказательств, произведенных компьютером, что программы соответствуют указанным спецификациям, вместо простого поиска ошибок».

В ответном письме Ершов написал Маккарти:

«Я не знаю другого человека в нашем вычислительном мире, чьи интересы и подход настолько были бы близки моим. Особенно мне импонирует Ваш интерес к математической теории вычислений и взаимодействию человека и машины. Так же, как, по-видимому, и Вы, Я считаю себя математиком, но в тайне надеюсь, что наша деятельность сможет что-то познать и изменить в реальном мире…».

Так мы можем увидеть, что даже во времена Холодной войны ученые могли договориться друг с другом — ведь их объединяла общая идея, способная нейтрализовать все идеологические разногласия во имя развития новой науки. По обеим сторонам железного занавеса основатели новой дисциплины верили в силу математических машин стать первым помощником человечества на пути прогресса независимо от политических или национальных барьеров. Ведь, в конце концов, понять друг друга гораздо проще, чем механизмы функционирования интеллекта.

Источники:

  • Использованы материалы сайта computer-museum.ru

  • Фотографии: sbras.nsu.ru

    Больше интересных статей в нашем блоге на Хабре. Недорогие сервера для ваших проектов — здесь.

Показать полностью 4
[моё] Познавательно IT Lisp Искусственный интеллект Timeweb Длиннопост
0
0
Simaguga
2 года назад
Лига Криптовалют

Chia переходит на Rust⁠⁠

Chia добавила репозиторий с применением языка Rust для смарт контрактов:
https://github.com/Chia-Network/clvm_rs

Видимо, разработчики Chia поняли, что LISP плохо подходит для написания смарт - контрактов из за своей сложности.

Rust сейчас используется в таких блокчейнах как: NEAR, Compound, Solana, APTOS и т.д., хотя, в разных блокчейнах используются разные модификации Rust, опыт показал, что производные этого языка привлекают разработчиков, а это сейчас необходимо экосистеме Chia

Источник: https://vk.com/chiacoinru?w=wall-204326702_3412

Криптовалюта Rust Криптовалюта Chia Lisp Текст
4
1195
Obrazovach
Obrazovach
7 лет назад
Интересные факты

Новость 343: Женщины превзошли мужчин в редактировании кода⁠⁠

Новость 343: Женщины превзошли мужчин в редактировании кода Образовач, Баян, Программист, Женщины, Мужчины, Lisp, Комиксы, Юмор

http://short.nplus1.ru/SmJMX1XFLo

[моё] Образовач Баян Программист Женщины Мужчины Lisp Комиксы Юмор
65
Alejandro3000
9 лет назад

Ищу человека⁠⁠

Ищу человека который работает и программирует на "LISP" (это подпрограмма в автокаде).

Связаться со мной напишу в комментах. Сам не умею хочу научиться. Если есть такие напишите мне в комменты, и я напишу как со мной связаться.  

[моё] Lisp Auto CAD AutoCAD Программирование Помощь Оплата будет Текст
14
Посты не найдены
О нас
О Пикабу Контакты Реклама Сообщить об ошибке Сообщить о нарушении законодательства Отзывы и предложения Новости Пикабу Мобильное приложение RSS
Информация
Помощь Кодекс Пикабу Команда Пикабу Конфиденциальность Правила соцсети О рекомендациях О компании
Наши проекты
Блоги Работа Промокоды Игры Курсы
Партнёры
Промокоды Биг Гик Промокоды Lamoda Промокоды Мвидео Промокоды Яндекс Директ Промокоды Отелло Промокоды Aroma Butik Промокоды Яндекс Путешествия Постила Футбол сегодня
На информационном ресурсе Pikabu.ru применяются рекомендательные технологии