thedeemon: (faculty of numbers)
[personal profile] thedeemon
Недавно я писал про простой шаг, добавляющий в систему типов обычного ФЯП зависимые типы: достаточно добавить один1 тип Type, элементами которого служат типы. Что занятно, из этого шага автоматически тут же следует первоклассность типов: они сразу же становятся обычными значениями, и их можно помещать в туплы, списки и т.д. и применять к ним обычные операции. Успешно компилирующийся в Идрисе пример:

swap : (a,b) -> (b,a)
swap (a,b) = (b,a)

v : fst $ swap ("hi there", head [Int, String])
v = 42

По этой причине в Идрисе нет ключевого слова newtype. Чтобы определить синоним типа, достаточно описать его как значение (или как функцию, частный случай значения):
Matrix : Type -> Type
Matrix a = List (List a)

m : Matrix Int
m = [[1,2], [3,4]]

Date: 2013-05-20 09:06 am (UTC)
wizzard: (Default)
From: [personal profile] wizzard
> v : (Expr)

Это прикольно, да)

Date: 2013-05-20 09:23 am (UTC)
From: [identity profile] deni-ok.livejournal.com
Когда ты пишешь Type -> Type, значит ли это, что эта штука тоже первоклассная? Если это так, то мы упираемся в проблему Type : Type, поскольку получающаяся система противоречива, если ее рассматривать как логическую.

Date: 2013-05-20 09:54 am (UTC)
From: [identity profile] thedeemon.livejournal.com
Не упираемся, там под капотом иерархия вселенных
42 : Int : Type0 : Type1 : Type2 : ...
и кумулятивность (Int : Type1, Int : Type2, ...).

Компилятор сам выводит и проверяет индексы в иерархии, а для программиста все эти вселенные называются Type.

Date: 2013-05-20 09:56 am (UTC)
From: [identity profile] nivanych.livejournal.com
Не вполне понятно, что делать, если надо конкретно Set1?

Date: 2013-05-20 10:32 am (UTC)
From: [identity profile] deni-ok.livejournal.com
Вроде в COQ это как-то обходят.

Date: 2013-05-20 10:36 am (UTC)
From: [identity profile] nivanych.livejournal.com
Ну, во-первых, там есть TypeN.
А во-вторых, для Prop оно меньше нужно. Впрочем, порасспрашиваю.

Date: 2013-05-24 04:13 pm (UTC)
From: [identity profile] sassa-nf.livejournal.com
а можно пример, где нужно выразить Set с конкретным левелом? (а не, допустим, ∀ левел)

Date: 2013-05-24 05:18 pm (UTC)
From: [identity profile] nivanych.livejournal.com
Это смотря, что понимать под "нужно".
Например, в пределе, вопрос сведётся к нужности статической типизации ;-)
Где это используют — да полно. В агдочковой библиотеке, в основном, делают для любого Level'а, ну или для уровня l строят конструкцию Set (Succ l).
То есть, там вполне нормально обходят вопрос с уровнями.
Ну сейчас найду, где бы было Set1, например.
Вообще, обычно, это всякое около-мета.
Вот, например, из старого —
http://www.iis.sinica.edu.tw/~scm/2008/typed-lambda-calculus-interprete/

Date: 2013-05-24 08:32 pm (UTC)
From: [identity profile] sassa-nf.livejournal.com
"вопрос сведётся"

что вы, что вы :) я ж не отрицатель, я ж о "что мы теряем, если не можем"

я так чувствую, где-то нужно покурить про universes.

Date: 2013-05-25 05:27 am (UTC)
From: [identity profile] nivanych.livejournal.com
Вот, например —
http://code.haskell.org/~dolio/agda-share/hoas/PHOAS.agda
простая и полезная вещь, обратить внимание на
Term : Set1
Term = ∀{V} → term V
Хотя я щас понял, что такие вещи выводятся относительно просто и можно просто оперировать Set'ами.
То есть, для указания Set1 просто указываешь Set, а оно там разберётся, кто какого типа.
Когда этого может не хватить, чотта и затрудняюсь сказать. Ну и чем это хуже или лучше. По мне, так лучше явно SetN указывать, порядку больше ;-)

Date: 2013-05-20 09:57 am (UTC)
From: [identity profile] deni-ok.livejournal.com
А, ну тогда это как у всех:)

Меня смутило "достаточно добавить один тип Type".

Date: 2013-05-20 10:47 am (UTC)
From: [identity profile] nivanych.livejournal.com
Есть же импредикативные системы, но не противоречивые.
Но предикативное непротиворечивым сделать проще.

Date: 2013-05-20 09:57 am (UTC)
From: [identity profile] thedeemon.livejournal.com
Слышал про него, но не щупал.

Date: 2013-05-20 10:04 am (UTC)
From: [identity profile] nivanych.livejournal.com
Нуу, он мёртвый уже.
Но мне показалось, что вполне так следует концепции в посте.
Из-за этого, можно и любой bottom заставить вычисляться в compile-time.

Date: 2013-05-20 10:00 am (UTC)
From: [identity profile] deni-ok.livejournal.com
Как у Леннарта на главной странице языка написано "The drawback of such a powerful type system is that the type checking becomes undecidable." :)

Date: 2013-05-20 10:03 am (UTC)
From: [identity profile] nivanych.livejournal.com
Ну это понятно — любую функцию можно заставить вычисляться в compile-time.
Самая главная няшка, это простота построения.
А неразрешимость относительно контролируема человеком. Точно так же, как и завершимость в runtime. В конце концов, макросы же как-то терпят? ;-)
Edited Date: 2013-05-20 10:10 am (UTC)

Date: 2013-05-20 10:30 am (UTC)
From: [identity profile] deni-ok.livejournal.com
Меня немножко смущает статус доказательства свойств функции, если её завершимость контролируется гуманистическим образом.

Date: 2013-05-20 10:35 am (UTC)
From: [identity profile] thedeemon.livejournal.com
Всех смущает. Доказательства должны быть тотальными.

Date: 2013-05-20 10:50 am (UTC)
From: [identity profile] deni-ok.livejournal.com
Это-то да. Если функция, чьи свойства мы доказываем, тоже тотальна, то тут всё ясно. Ну с точностью до того, что это часто весьма нетривиально, хотя один мой аспирант шутит, что он скоро напишет proof assistant, в котором почти везде достаточно будет писать refl:)

Вопрос в том, как доказывать свойства других полезных функций.

Date: 2013-05-26 10:35 am (UTC)
From: [identity profile] sassa-nf.livejournal.com
"мой аспирант ... скоро напишет proof assistant"

а он уже доказал свою бессмертность незавершимость?

Date: 2013-05-26 10:43 am (UTC)
From: [identity profile] thedeemon.livejournal.com
Аспирантам главное доказать защитимость! :)

Date: 2013-05-20 10:52 am (UTC)
From: [identity profile] nivanych.livejournal.com
Ну так надо дополнительно доказать завершимость!
Построить башню из 3-4 доказательств завершимости предыдущей ступени и посчитать, что это достаточно надёжно!
;-)

Date: 2013-05-20 12:00 pm (UTC)
From: [identity profile] bwbwbw.livejournal.com
Иметь Type:Type - это не так уж и страшно.
Хоть type checking и не разрешим, он всё еще полуразрешим. Если вас очень волнует корректность можно всегда запустить type checker, который, если у вас всё хорошо, завершится с успехом, а если всё плохо, то либо сообщит об ошибке, либо зависнет.
И пусть зависающий компилятор вас не смущает, т.к. случайно написать зависающую программу у вас вряд ли получится. Даже при большом желании это не так просто, если не знать как. К тому же, и без Type:Type легко написать код, который повесит компилятор, хоть и не навечно, но фактически вы не дождетесь его завершения.

Date: 2013-05-21 04:47 am (UTC)
From: [identity profile] nivanych.livejournal.com
> случайно написать зависающую программу у вас вряд ли получится

Тов. Gregory Chaitin доказал, что вероятность зависания экспоненциально убывает с длиной программы ;-)

Date: 2013-05-20 10:11 am (UTC)
From: [identity profile] thedeemon.livejournal.com
А ежели мы включим проверку тотальности?

Date: 2013-05-20 10:16 am (UTC)
From: [identity profile] deni-ok.livejournal.com
Ага, проверим well-foundness для индукции, добавим продуктивную коиндукцию для IO, поддержку Юникода и получим Агдочку:)

Date: 2013-05-20 10:21 am (UTC)
From: [identity profile] sassa-nf.livejournal.com
Как недавно здесь Борат высказался, dependent types let you have a runtime exception at compile time :)

Date: 2013-05-20 10:49 am (UTC)
From: [identity profile] nivanych.livejournal.com
Ну вот это он про Cayennne говорил, как теперь всем очевидно ;-)

Profile

thedeemon: (Default)
Dmitry Popov

December 2025

S M T W T F S
 12 3456
789101112 13
14151617181920
21222324252627
28293031   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 9th, 2026 03:07 pm
Powered by Dreamwidth Studios