Повернувшись до цього майже через рік, я зрозумів, що пропустив кілька критичних досліджень перед публікацією.
Здається, 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
З моїх власних експериментів повільно підтверджується гіпотеза про те, що Джот веде до менших програм, коли моя програма вивчає прості функції, складає їх, потім вивчає більші функції з покращеної стелі.