Original: http://alum.wpi.edu/~tfraser/Software/Arduino/lambdacan.html
Lambda-числення в Can
Ви можете отримати суп в банку. Ви можете отримати хліб в банку (*). Тепер довге очікування закінчилося! Ви можете, нарешті, отримати лямбда-числення в банку.
Проект LambdaCan це веселе вправу в абсурдності. Він реалізує редуктор (перекладач) для лямбда-числення, формальна система (мова програмування), розробленої Алонзо церкви в 1930-х роках, щоб атакувати найглибшу задачку дня. Це була проблема дозволу, питання про те, чи існує чи ні алгоритму, здатного вирішити, істинність або хибність всіх висловлювань в математиці.
Проект LambdaCan приймає цей інструмент для вивчення найглибших математичних задач і реалізує його на мікроконтролер краще підходить для найбільш повсякденним завдань, як працює автомат з продажу або мікрохвильовій печі. І він прилипає мікроконтролер в банку, який можна підключити до комп’ютера за допомогою кабелю USB.
Звичайно, крайні накладні витрати, пов’язані в підтримці болісно абстрактної лямбда-числення позначення робить LambdaCan боротьбу обчислити арифметику так просто, як 11 + 12 = 23. Микроконтроллер буде працювати набагато краще, якщо він запрограмований на своїй рідній мові. Крім того, сама ідея закупорювання LambdaCan співпроцесор в типовий ПК для виконання обчислень є абсурдним, оскільки PC, без сумніву, може обробляти набагато більші обчислення швидше на своїх власних.
Але … агов, це лямбда-числення в банку!
Створіть свій власний LambdaCan
LambdaCan є по суті плата Arduino Diecimila встановлений в краплі від кашлю можна за допомогою епоксидної мастикою. Плата Diecimila використовує мікроконтролер Atmel ATmega168 з 16KB флеш-пам’яті і 1 КБ SRAM. Це улюблений мікроконтролера хакерського співтовариства з великою кількістю безкоштовної підтримки програмного забезпечення доступні в Інтернеті. Ось кроки:
1. Завантажте програмне забезпечення LambdaCan тут. Дотримуйтесь інструкцій в тарболла, щоб побудувати його і завантажити його на борт Diecimila.
2. Вирізати отвір в банку для роз’єму USB в Diecimila до протикати.
3. Встановіть плату Diecimila в невеликий пластиковий пакет. Накрийте нижні краї банки з епоксидної мастикою. У той час як шпаклівка ще м’яка, розітріть пластикову загорнута дошку Diecimila в неї, поки плата не знаходиться в положенні з його роз’єм USB стирчать з отвору в банку. Поліетиленовий пакет буде тримати липку епоксидної смоли з вашої поради. Вийміть плату та нехай епоксидна замазка твердне. Викиньте пластиковий пакет.
4. Spraypaint банку. Дайте йому висохнути.
5. Помістіть плату Diecimila в банку. Укріплений expoy шпаклівка повинна гарантувати, що він залишається в правильному положенні. Щільно закривати банки. Готово!
FYI:
• Ви можете відкрити банку, якщо вам потрібно потрапити кнопку скидання плати.
• Так як ми використовували епоксидну мастику тільки затвердіти в форму, щоб прийняти плату, а не клеїти дошку на місці, якщо ви хочете, ви можете видалити дошку і використовувати його для чогось ще пізніше.
Використання LambdaCan
Щоб використовувати LambdaCan, завантажте свою улюблену машину GNU / Linux, а потім підключити LambdaCan в до вільного порту USB. прогін
screen /dev/ttyUSB0 9600
в оболонці, щоб взаємодіяти з LambdaCan. З іншого боку, інструкції включені в початковий код може сказати вам, як побудувати версію POSIX програмного забезпечення, яке ви можете запустити в оболонці без необхідності в LambdaCan апаратних засобів.
Синтаксис лямбда-числення дуже простий: він має такі змінні, як х і функції, такі як (\ x.x). Ця функція, наприклад, приймає один аргумент х і повертає значення цього аргументу — це функція тотожності. В оригінальному синтаксисі Церкви, то \ буде лямбда. Період трохи синтаксичний цукор, щоб зробити функцію більш зручним для читання шляхом візуального розділення параметрів від тіла. Лямбда Обчислення також включає в себе додатки функцій. Наприклад, ((\ x.x) A) застосовує вище тотожну функцію до аргументу А. редукційний вираження, по крайней мере, в найпростіших випадках, становить синтаксично підстановлювальних аргументів для формальних параметрів у функції органів, наприклад, так:
>> ((\x.x) A);; -> A \>
Щоб зменшити, ми зіставляємо аргументу з формальним параметром х, а потім замінити всі входження х в організмі з А. -> символ вказує на один крок скорочення, \> символ вказує на подальше зменшення не можливо.
Ось формальна граматика LambdaCan використовує. Зверніть увагу, що ви можете помістити прогалини і символи повернення каретки в будь-якому місці ви хочете, але ви повинні закінчити введення даних з:
START ::= FORMULA ';;' FORMULA ::= VARIABLE | '(' FORMULA FORMULA ')' | '(' '\' VARIABLE '.' FORMULA ')' VARIABLE ::= [A-Z,a-z]
У цей найголовніша форма, немає числа або рядки в лямбда-числення — тільки функції. Тим не менш, ви можете винайти угоди про те, як кодувати числа як функції. Одна така конвенція називається “Черча” кодує числа наступним чином:
0 = (\s.(\z.z)) 1 = (\s.(\z.(s z))) 2 = (\s.(\z.(s (s z))))
Кожен номер представлений окремою функцією двох аргументів: з і р Число додатків з кодує числове значення: нуль для 0, по одному на 1, два для 2 і так далі. Використовуючи цю угоду, ви закодувати операцію M + N наступним чином:
(\M.(\N.(\s.(\z.(M (s (N (s z))))))))
Тому, коли просять обчислити 1 + 1 = 2, Лямбда Can виробляє наступний висновок:
>> (( >> (\M.(\N.(\s.(\z.((M s) ((N s) z)))))) >> (\s.(\z.(s z)))) >> (\s.(\z.(s z)))) >> ;; -> ((\N.(\s.(\z.(((\s.(\z.(s z))) s) ((N s) z))))) (\s.(\z.(s z)))) -> (\s.(\z.(((\s.(\z.(s z))) s) (((\s.(\z.(s z))) s) z)))) -> (\s.(\z.(((\s.(\z.(s z))) s) ((\z.(s z)) z)))) -> (\s.(\z.(((\s.(\z.(s z))) s) (s z)))) -> (\s.(\z.((\z.(s z)) (s z)))) -> (\s.(\z.(s (s z)))) /> Nodes used: 40 Vars used: MNsz
Ось 11 + 12 = 23, калькулятор, який використовує майже всі з доступної пам’яті LambdaCan в:
(( (\M.(\N.(\s.(\z.((M s) ((N s) z)))))) (\s.(\z.(s (s (s (s (s (s (s (s (s (s (s z)))))))))))))) (\s.(\z.(s (s (s (s (s (s (s (s (s (s (s (s z))))))))))))))) ;; -> ((\N.(\s.(\z.(((\s.(\z.(s (s (s (s (s (s (s (s (s (s (s z))))))))))))) s) ((N s) z))))) (\s.(\z.(s (s (s (s (s (s (s (s (s (s (s (s z))))))))))))))) -> (\s.(\z.(((\s.(\z.(s (s (s (s (s (s (s (s (s (s (s z))))))))))))) s) (((\s.(\z.(s (s (s (s (s (s (s (s (s (s (s (s z)))))))))))))) s) z)))) -> (\s.(\z.(((\s.(\z.(s (s (s (s (s (s (s (s (s (s (s z))))))))))))) s) ((\z.(s (s (s (s (s (s (s (s (s (s (s (s z))))))))))))) z)))) -> (\s.(\z.(((\s.(\z.(s (s (s (s (s (s (s (s (s (s (s z))))))))))))) s) (s (s (s (s (s (s (s (s (s (s (s (s z))))))))))))))) -> (\s.(\z.((\z.(s (s (s (s (s (s (s (s (s (s (s z)))))))))))) (s (s (s (s (s (s (s (s (s (s (s (s z))))))))))))))) -> (\s.(\z.(s (s (s (s (s (s (s (s (s (s (s (s (s (s (s (s (s (s (s (s (s (s (s z))))))))))))))))))))))))) /> Nodes used: 124 Vars used: MNsz
Скачати
LambdaCan джерело, працездатна як для Arduino Diecimila і POSIX:
Примітки:
• (*) На хліб в банку: так, вона дійсно існує. На початку 90-х моїх сусідів по кімнаті коледжу, і я прийшов у володіння банку з написом “Brown Bread в Can”. Ніколи не уявляв собі такий харчовий продукт, ми дивувалися на нього в подиві протягом багатьох місяців, перш ніж кілька боязко відкриття банку, щоб побачити, що це насправді міститься. Як і слід було очікувати, це була невелика буханець житнього хліба. Ми поливали буханку в спирті, підпалити його, і кинув палаючу масу з вікна. Весь цей епізод має сенс для нас в той час.
• Я портовано код з більш ранньої лямбда-числення редуктора я зробив для старої дошки Zilog, тут. Знадобилося деякі суттєві зміни, щоб підігнати його в 1KB Микроконтроллер Atmel ATmega168 про SRAM.