Загальновідомо, що комбінатори S і K є Turing Complete. Чи є комбінатори, яких достатньо для отримання (лише) примітивних рекурсивних функцій?
Загальновідомо, що комбінатори S і K є Turing Complete. Чи є комбінатори, яких достатньо для отримання (лише) примітивних рекурсивних функцій?
Відповіді:
Так, але вам доведеться враховувати набрані комбінатори. Тобто вам потрібно надати і такі схеми типів: де і - мета-змінні, які можна примірник будь-якого конкретного типу при кожному використанні.K K : A → B → A S : ( A → B → C ) → ( A → B ) → ( A → C ) A , B C
Потім потрібно додати тип натуральних чисел до мови типів і додати наступні комбінатори: z : N s u c c : N → N i t e r : N → ( N → N ) → N → N
Правилами рівності для доповнень є:
Набагато простіше читати програми, які ви пишете, якщо ви просто пишете програми в просто набраному лямбдальному обчисленні, доповненому цифрами та ітерацією. Описана мною система - це обмеження Т на Геделя , мова арифметики вищого типу. У T Goedel введення тексту для ітерації менш обмежене: У T , ви можете інстанціювати будь-якого типу, а не лише типу натуральних чисел. Це призведе до минулої примітивної рекурсії і дозволяє визначити такі речі, як функція Акермана. iter
EDIT: Xoff запитав, як кодувати функцію попередника. Це випливає за допомогою стандартного трюку. Для пояснення я використовую лямбда-позначення для цього (яке можна усунути дужкою-абстракцією), оскільки це набагато читабельніше. Спочатку припустимо, що у нас є пари і більш загальний тип для . Тоді ми можемо визначити:
Якщо у вас просто є ітератор типу nat, ви повинні використовувати ізоморфізм, що
iter
. Це може бути предметом запитання на cs.stackexchange.com ...