Найпростіша повна основа основи комбінатора для плоских виразів


9

У статті Кріса Окасакі " Комбінатори згладжування : виживання без дужок " він показує, що два комбінатори є і достатніми, і необхідними в якості основи для кодування виразів Тюрінга, не потребуючи оператора програми чи дужок.

Порівняно з кодуванням Джона Трампа комбінаторної логіки у " Бінарному обчисленні лямбда та комбінаційної логіки " через префікс, що кодує комбінатори S і K з оператором програми, лише два комбінатори для плоских виразів збільшують щільність коду до оптимальності. Отримана нумерація Goedel відображає кожне ціле число на дійсне, добре сформоване замкнене вираження на відміну від більшості обчислень та мінімальної довжини опису відповідних езолангів, канонічні подання яких зазвичай дозволяють описи синтаксично недійсних програм.

Однак кодування Окасакі повинно було бути найбільш корисним у односторонньому відображенні від термінів обчислення лямбда до бітстринга, не обов'язково навпаки, оскільки два комбінатори, що використовуються при цьому зменшенні, є відносно складними, коли використовуються як практичні вказівки щодо заміни.

Яка найпростіша повна основа бази комбінаторів, яка не потребує оператора програми?


1
Не впевнений, чи це доречно, але: зауважте, що існують основи лямбдального обчислення, утворені одним членом. Це робить нумерацію Геделя ще простішою. cs.uu.nl/research/techreps/repo/CS-1989/1989-14.pdf
chi

Відповіді:


2

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

Здається, Jot відповідає рахунку того, про що я просив, з двома відносно простими комбінаторами B&X, які можуть бути представлені компактною нумерацією Goedel.

Я спростив його референтну реалізацію з Python:

def S(x): return lambda y: lambda z: x(z)(y(z))
def K(x): return lambda y: x
def X(x): return x(S)(K)
def B(x): return lambda y: lambda z: x(y(z))
def I(x): return x
def J(n): return (B if n & 1 else X)(J(n >> 1)) if n else I

J (n) повертає вбудовану функцію, що позначає програму, представлену її номером Goedel n.

B (еквівалентно множини, кодованої Церквою) виконує функцію функціонального застосування (дужки) і може виділяти половини S / K одноосновного йотового комбінатора X.

Є кілька важливих властивостей цієї мови, які я (майже) безсоромно краду з веб-сайту винахідника мови Кріса Баркера, близько 2000 року.

Jot - це звичайна мова в синтаксисі, але Тьюрінг - повна. З реалізації J (n) видно, що якщо мова хосту підтримує рекурсію хвоста, для розбору програмного формату бітстрингу не потрібно місця для стеку.

Доказ повноти Тьюрінга також походить з сайту Кріса, реалізуючи вже відому комбінаторну логіку Тьюрінга, використовуючи комбінатори S і K:

K  ==> 11100
S  ==> 11111000
AB ==> 1[A][B], where A & B are arbitrary CL combinators built up from K & S

У Jot немає синтаксичних помилок, кожна програма з даним номером Goedel n є дійсною програмою. Це, мабуть, найважливіший аспект мого власного дослідження, оскільки він не тільки спрощує аналіз на тривіальність, але й теоретично повинен зробити Jot набагато більш сприятливим, ніж будь-яке повне кодування Тьюрінга, яке доводиться пропускати через неправильно сформовані програми.

Я написав кілька інструментів, щоб «вирішити» грубою силою напіввирішувану проблему пошуку складності Колмогорова функції у Jot. Він працює, покладаючись на програміста, щоб вказати кілька дуже характерних прикладів тренувань функції відображення функції, потім перерахував усі програми Jot до тих пір, поки всі приклади тренувань не збігаються, і нарешті намагається довести рівність знайденої функції з оригінальною багатослівною реалізацією.

Наразі він працює лише до ~ 40 біт з моїми обмеженими ресурсами. Я намагаюся переписати програму SAT Solver, щоб дізнатися набагато більші програми. Якщо ви знаєте, як розгортати обмежені вкладені закриття як булева формула, будь ласка, допоможіть з моїм новим запитанням .

Тепер для цікавих порівнянь з Бінарним обчисленням лямбда Джона Тромпа, який відомий своєю стислістю, але має проблему можливих синтаксичних помилок. Наступні програми були створені моєю навчальною програмою за кілька секунд.

Function    Jot       Binary Lambda Calculus   |J| |B|
--------|----------|--------------------------|---|---
SUCC      J(18400)  "000000011100101111011010" 15  24
CHURCH_0  J(154)    "000010"                    8   6
CHURCH_1  J(0)      "00000111010"               1  11
CHURCH_2  J(588826) "0000011100111010"         20  16
IS_ZERO   J(5)      "00010110000000100000110"   3  23
MUL       J(280)    "0000000111100111010"       9  19
EXP       J(18108)  "00000110110"              15  11
S         J(8)      "00000001011110100111010"   4  23
K         J(4)      "0000110"                   3   7
AND       J(16)     "0000010111010000010"       5  19
OR        J(9050)   "00000101110000011010"     14  20

З моїх власних експериментів повільно підтверджується гіпотеза про те, що Джот веде до менших програм, коли моя програма вивчає прості функції, складає їх, потім вивчає більші функції з покращеної стелі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.