Может ли зависимо типизированный язык быть полным по Тьюрингу?

Кажется, что зависимо типизированные языки часто не являются полными по Тьюрингу. Почему мы не можем позволить каждой функции иметь общую рекурсию (что сделало бы язык Тьюринга полным), вместо того, чтобы разрешить только более ограниченную форму рекурсии?

Что-то мешает создателям зависимо типизированных языков разрешить всем функциям возможность общей рекурсии?

Например:

Меня смущает вопрос: ни один язык программирования не является полным по Тьюрингу. Это, скорее, была точка зрения Тьюринга (и Гёделя). Не просто «часто», а всегда. Тогда что вы конкретно спрашиваете о языках с зависимой типизацией?

AntC 26.05.2024 22:39

@AntC «Тьюринг завершен» не означает «может решить проблему остановки».

David Young 26.05.2024 22:56

@AntC, да? Это полная противоположность реальности. Каждый язык программирования является полным по Тьюрингу, как и множество вещей, на которые нужно очень сильно прищуриться, чтобы увидеть, что они могут выполнять вычисления.

Cubic 27.05.2024 09:44

Ик, спасибо, ребята. Мозг-о. Должно быть, я путаю с «решить проблему остановки».

AntC 29.05.2024 02:25

Я немного поработал над формулировкой вопроса и названием. Это все еще соответствует вопросу, который вы хотите задать? Я включил деталь, которую, по моему мнению, упустили из виду. Эта конкретная деталь, я считаю, до сих пор приводит к путанице. Сделав это явным, мы сможем более эффективно решить этот вопрос. Надеюсь, это поможет, и дайте мне знать, если это не соответствует тому, что вы хотите спросить!

David Young 29.05.2024 04:11

На случай, если он не будет открыт повторно, вот ответ: есть что-то, что мешает многим создателям зависимо типизированных языков сделать его полным по Тьюрингу «очевидным» способом (путем разрешения общей рекурсии повсюду). Мы можем рассматривать систему типов как соответствующую своего рода логике. С этой точки зрения мы можем писать программы, соответствующие доказательствам теорем. Но разрешение каждой функции выполнять общую рекурсию приводит к противоречивой логике. Однако мы все равно можем получить полноту по Тьюрингу другим способом, проявив немного большую осторожность. См. ответ @gallais для хорошего обзора этого.

David Young 29.05.2024 19:29
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
6
336
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

То, что вы прочитали, является дезинформацией.

Например, в IO.Base вы можете увидеть, что стандартная библиотека Agda поставляется с комбинатор под названием forever, который успешно выполняет действие IO до тех пор, пока конец времен (или, что более вероятно, действие IO в конечном итоге решает вызвать либо exitSuccess, либо exitFailure):

forever : IO {a} ⊤ → IO {a} ⊤

Функции вы конечно не найдете fix : (A → A) → A но это так потому что тип должен быть честен в отношении возможности незавершения (точно так же, как типы в Haskell должны честно говорить о возможности мутация, или ввод-вывод, или сбой). Чтобы инкапсулировать такие эффекты, вы обычно используют монады. Выше мы использовали монаду IO, но есть и другие монады, улавливающие идею незавершенности, ср. Полнота Тьюринга Макбрайда совершенно бесплатно

Ух ты. ХОРОШО. Это отличный ответ - спасибо. Но почему в различных местах сообщается, что agda не является полной по Тьюрингу? Откуда это вообще взялось?

Municipal-Chinook-7 26.05.2024 15:43

Именно здесь полезно рассматривать Agda как неполный по Тьюрингу DSL, который производит полные по Тьюрингу действия ввода-вывода.

chepner 26.05.2024 17:03

Я чувствую, что это несколько обманчиво избегает истины. Мотивация использования этих языков в качестве систем доказательства и плохое взаимодействие этой идеи с самореференцией полностью утрачены.

Daniel Wagner 26.05.2024 17:20

Я думаю, что ответ дает некоторую полезную информацию, которая часто теряется, но в то же время я согласен с @DanielWagner. Полностью неограниченная общая рекурсия приводит к противоречивости, если рассматривать язык как логику. Чтобы избежать этого, вам придется тщательно ограничить его.

David Young 26.05.2024 21:04

@DanielWagner, не могли бы вы рассказать мне об этом подробнее? Спасибо :)

Municipal-Chinook-7 27.05.2024 01:25

🤷 нет ничего обманчивого в том, что типы должны честно говорить о нерасторжении. И это не какой-то загадочный выход: используя бисимуляции, вы можете доказать свойства этих потенциально незавершаемых программ!

gallais 27.05.2024 09:22

Другие вопросы по теме