20.09.2016

Проект LambdaCan

Original: http://alum.wpi.edu/~tfraser/Software/Arduino/lambdacan.html

Lambda-числення в Can


Ви можете отримати суп в банку. Ви можете отримати хліб в банку (*). Тепер довге очікування закінчилося! Ви можете, нарешті, отримати лямбда-числення в банку.(Arduino board mountedin can)
Проект LambdaCan це веселе вправу в абсурдності. Він реалізує редуктор (перекладач) для лямбда-числення, формальна система (мова програмування), розробленої Алонзо церкви в 1930-х роках, щоб атакувати найглибшу задачку дня. Це була проблема дозволу, питання про те, чи існує чи ні алгоритму, здатного вирішити, істинність або хибність всіх висловлювань в математиці.


Проект LambdaCan приймає цей інструмент для вивчення найглибших математичних задач і реалізує його на мікроконтролер краще підходить для найбільш повсякденним завдань, як працює автомат з продажу або мікрохвильовій печі. І він прилипає мікроконтролер в банку, який можна підключити до комп’ютера за допомогою кабелю USB.


Звичайно, крайні накладні витрати, пов’язані в підтримці болісно абстрактної лямбда-числення позначення робить LambdaCan боротьбу обчислити арифметику так просто, як 11 + 12 = 23. Микроконтроллер буде працювати набагато краще, якщо він запрограмований на своїй рідній мові. Крім того, сама ідея закупорювання LambdaCan співпроцесор в типовий ПК для виконання обчислень є абсурдним, оскільки PC, без сумніву, може обробляти набагато більші обчислення швидше на своїх власних.


Але … агов, це лямбда-числення в банку!


Створіть свій власний LambdaCan


LambdaCan є по суті плата Arduino Diecimila встановлений в краплі від кашлю можна за допомогою епоксидної мастикою. Плата Diecimila використовує мікроконтролер Atmel ATmega168 з 16KB флеш-пам’яті і 1 КБ SRAM. Це улюблений мікроконтролера хакерського співтовариства з великою кількістю безкоштовної підтримки програмного забезпечення доступні в Інтернеті. Ось кроки:


1. Завантажте програмне забезпечення LambdaCan тут. Дотримуйтесь інструкцій в тарболла, щоб побудувати його і завантажити його на борт Diecimila.(Components used in Project LambdaCan)
2. Вирізати отвір в банку для роз’єму USB в Diecimila до протикати.
3. Встановіть плату Diecimila в невеликий пластиковий пакет. Накрийте нижні краї банки з епоксидної мастикою. У той час як шпаклівка ще м’яка, розітріть пластикову загорнута дошку Diecimila в неї, поки плата не знаходиться в положенні з його роз’єм USB стирчать з отвору в банку. Поліетиленовий пакет буде тримати липку епоксидної смоли з вашої поради. Вийміть плату та нехай епоксидна замазка твердне. Викиньте пластиковий пакет.
4. Spraypaint банку. Дайте йому висохнути.
5. Помістіть плату Diecimila в банку. Укріплений expoy шпаклівка повинна гарантувати, що він залишається в правильному положенні. Щільно закривати банки. Готово!


FYI:
• Ви можете відкрити банку, якщо вам потрібно потрапити кнопку скидання плати.
• Так як ми використовували епоксидну мастику тільки затвердіти в форму, щоб прийняти плату, а не клеїти дошку на місці, якщо ви хочете, ви можете видалити дошку і використовувати його для чогось ще пізніше.


Використання LambdaCan


Щоб використовувати LambdaCan, завантажте свою улюблену машину GNU / Linux, а потім підключити LambdaCan в до вільного порту USB. прогін (LambdaCan in action)

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:


lambdacan-v2.0.tar.gz


Примітки:
• (*) На хліб в банку: так, вона дійсно існує. На початку 90-х моїх сусідів по кімнаті коледжу, і я прийшов у володіння банку з написом “Brown Bread в Can”. Ніколи не уявляв собі такий харчовий продукт, ми дивувалися на нього в подиві протягом багатьох місяців, перш ніж кілька боязко відкриття банку, щоб побачити, що це насправді міститься. Як і слід було очікувати, це була невелика буханець житнього хліба. Ми поливали буханку в спирті, підпалити його, і кинув палаючу масу з вікна. Весь цей епізод має сенс для нас в той час.


• Я портовано код з більш ранньої лямбда-числення редуктора я зробив для старої дошки Zilog, тут. Знадобилося деякі суттєві зміни, щоб підігнати його в 1KB Микроконтроллер Atmel ATmega168 про SRAM.

About The Author

admin

Comments are closed.