thedeemon: (office)
[personal profile] thedeemon
Все мы помним про карринг, позволяющий функцию, принимающую пару аргументов, заменить на функцию от одного аргумента, возвращающую функцию от второго, которая уже возвращает нужный результат. Типы ((a,b) -> c) и (a -> b -> c) эквивалентны, т.к. мы можем описать две функции от одного к другому и обратно, композиция которых равна id, т.е. построить изоморфизмы. Запишем их на хаскелеподобном языке Идрис:
id1 : ((a,b) -> c) -> (a -> b -> c)
id1 f = \a => \b => f (a,b)

id2 : (a -> b -> c) -> ((a,b) -> c)
id2 f = \pair => f (fst pair) (snd pair)

В хаскеле они есть в стандартной библиотеке под именами curry и uncurry. Теперь вспомним соответствие Карри-Говарда, связывающее типы с утверждениями, а значения с доказательствами. Произведение типов (тупл, product type) там превращается в конъюнкцию, функциональный тип - в следствие. Фактически, выше мы доказали утверждение
((A & B) => C) == (A => (B => C))

Теперь перенесемся в мир зависимых типов, взяв тот же язык Идрис. Одним из базовых элементов, появляющихся с зависимыми типами, является зависимая пара - обобщение произведения типов, также известное как зависимая сумма (dependent sum):
Σ(x:A),P(x)
Это тип пары элементов, где тип второго элемента зависит от значения первого элемента. Далее для порядка будем типы обозначать большими буквами, а значения маленькими. В идрисе зависимая пара определа так:
data Exists : (A : Type) -> (P : A -> Type) -> Type where
  Ex_intro : {P : A -> Type} -> (a : A) -> P a -> Exists A P

Слово Exists, как и знак Σ, появилось тут неслучайно. Логическая интепретация такой пары звучит как "существует такой x, для которого выполнено утверждение Р(х)". Сам Σ-тип становится утверждением о том, что это дело существует, а значения этого типа, пары конкретных значений, становятся доказательствами. В них первый элемент называется witness, свидетель, т.к. это конкретный пример того значения х, про которое мы утверждаем, что оно существует, а второй элемент называется proof, т.к. он служит доказательством выполненности утверждения Р для этого х. Для таких пар в идрисе есть специальный синтаксис:
(a ** b)
Аналогами функций fst и snd, извлекающих первый и второй элементы пары, служат функции getWitness и getProof:
getWitness : {P : a -> Type} -> Exists a P -> a
getWitness (a ** v) = a

getProof : {P : a -> Type} -> (s : Exists a P) -> P (getWitness s)
getProof (a ** v) = v


Теперь давайте возьмем описанные в начале поста изоморфизмы про обычные пары, и запишем их для зависимых пар:
using (A : Type, B : A->Type, C : Type)
  id3 : ((x:A ** B x) -> C) -> ((x:A) -> B x -> C)
  id3 f = \a => \b => f (a ** b)

  id4 : ((x:A) -> B x -> C) -> ((x:A ** B x) -> C)
  id4 f = \p => f (getWitness p) (getProof p)

Тела функций те же самые, просто операции с туплами поменялись на операции с зависимыми парами. Что же нам говорят типы? Что мы доказали следующее утверждение:
((∃x:A . B(x)) => C) == (∀x:A . (B(x) => C))
Это то, что позволяет в языках вроде хаскеля и окамла записывать экзистенциальные типы, обходясь без ключевого слова exists, а лишь квантором всеобщности forall.

Еще один морфизм на ту же тему:
  id5: (x:A ** (B x -> C)) -> (((x:A) -> B x) -> C)
  id5 p = \f => (getProof p) (f (getWitness p)) 

Он показывает, что
(∃x:A . (B(x) => C)) => ((∀x:A . B(x)) => C)
Говорят, что в обратную сторону тоже верно, но у меня такую функцию построить не получилось.

Date: 2013-01-21 10:20 am (UTC)
From: [identity profile] migmit.livejournal.com
> (∃x:A . (B(x) => C)) => ((∀x:A . B(x)) => C)
> Говорят, что в обратную сторону тоже верно, но у меня такую функцию построить не получилось.

Если C имеет только одно значение, то справа стоит единственный элемент, а слева - целое A. Так что и не получится.

Date: 2013-01-21 10:48 am (UTC)
From: [identity profile] thedeemon.livejournal.com
В обратную сторону нужно из функции, принимающей зависимое произведение, получить другую зависимую пару. Для этого нужно предъявить конкретное значение х, но его как-то негде взять. Возможно, нужно что-то большее, чем интуиционистская логика.
Edited Date: 2013-01-21 10:49 am (UTC)

Date: 2013-01-21 11:13 am (UTC)
From: [identity profile] migmit.livejournal.com
Гррр. Ещё раз: "Так что и не получится".

Date: 2013-01-21 11:19 am (UTC)
From: [identity profile] thedeemon.livejournal.com
Я знаю, что не получится, но потому что там "C имеет только одно значение". Там функция же, а не одно значение.

Date: 2013-01-21 11:22 am (UTC)
From: [identity profile] migmit.livejournal.com
Закусывать надо.

C, по условию, произвольный тип. Значит, в частности, должно работать в случае, когда C имеет лишь одно значение.

Date: 2013-01-21 11:24 am (UTC)
From: [identity profile] thedeemon.livejournal.com
Пойду закусывать. Действительно неправильно ваш первый коммент прочитал.

Date: 2013-01-21 11:38 am (UTC)
From: [identity profile] sassa-nf.livejournal.com
А как быть с continuation passing? Или оно не описывается этой теорией?

(вызвать f, выскочить из него, когда известно x - это witness; далее, когда в proof "вбросят" B x, вернуться в f и узнать C - т.о. способ связи x:A и (B x) полностью снаружи id6)

Date: 2013-01-21 11:18 am (UTC)
From: [identity profile] dima-starosud.livejournal.com
В обратную сторону для любых A B C доказать нельзя, контрпример:
A - не населенный;
C - населенный;
B - любой;
Тогда функция с типом ((∀x:A . B(x)) => C) существует, но значение с типом (∃x:A . (B(x) => C)) построить нельзя, поскольку нельзя найти x:A.
Т.е. если просто, выходит True => False

Date: 2013-01-21 11:22 am (UTC)
From: [identity profile] thedeemon.livejournal.com
Ага.

Я, кстати, уже после того, как код для этого поста написал, увидел аналогичный пост у вас в блоге, только там Агда.
(deleted comment)

(no subject)

From: [identity profile] dima-starosud.livejournal.com - Date: 2013-01-21 12:38 pm (UTC) - Expand

Date: 2013-01-21 12:31 pm (UTC)
From: [identity profile] dima-starosud.livejournal.com
И что лучше? *спрашиваю не холивара ради =)
Посоветуйте, пожалуйста, что-то маленькое почитать, чтобы все стало достаточно ясно о Идрис.

(no subject)

From: [identity profile] thedeemon.livejournal.com - Date: 2013-01-21 04:46 pm (UTC) - Expand

(no subject)

From: [identity profile] dima-starosud.livejournal.com - Date: 2013-01-21 05:07 pm (UTC) - Expand

(no subject)

From: [identity profile] deni-ok.livejournal.com - Date: 2013-01-21 08:20 pm (UTC) - Expand

(no subject)

From: [identity profile] dima-starosud.livejournal.com - Date: 2013-01-21 09:08 pm (UTC) - Expand

(no subject)

From: [identity profile] thedeemon.livejournal.com - Date: 2013-01-22 02:32 am (UTC) - Expand

(no subject)

From: [identity profile] thesz.livejournal.com - Date: 2013-01-21 07:47 pm (UTC) - Expand

(no subject)

From: [identity profile] migmit.livejournal.com - Date: 2013-01-21 08:04 pm (UTC) - Expand

(no subject)

From: [identity profile] thesz.livejournal.com - Date: 2013-01-21 08:11 pm (UTC) - Expand

(no subject)

From: [identity profile] dima-starosud.livejournal.com - Date: 2013-01-21 08:51 pm (UTC) - Expand

Date: 2013-01-21 11:32 am (UTC)
From: [identity profile] dima-starosud.livejournal.com
А что значит "слева С, а справа целое А"?
(∃x:A . (B(x) => C)) - это целое А?

Date: 2013-01-21 12:42 pm (UTC)
From: [identity profile] migmit.livejournal.com
Ну да. Ведь B(x) => C - это одно-единственное значение, каким бы ни было B. То есть, proof всегда только один. Остаётся witness.

Date: 2013-01-21 01:56 pm (UTC)
From: [identity profile] dima-starosud.livejournal.com
Вас смущает, что на всех (х:А) есть только одно (B(x) => C)? Но это не страшно, рассмотрите например (∃x:A . True): берете любое (х:А) и единственный экземпляр из True и составляете пару - никаких проблем.

*(но так штука в обратную сторону конечно же не доказывается)

Date: 2013-01-21 05:44 pm (UTC)
From: [identity profile] migmit.livejournal.com
Вам тоже надо закусывать. Вы зачем-то решили доказать моё утверждение, что между A и (∃x:A . (B(x) => C)) нет никакой разницы.

(no subject)

From: [identity profile] dima-starosud.livejournal.com - Date: 2013-01-21 05:51 pm (UTC) - Expand

(no subject)

From: [identity profile] migmit.livejournal.com - Date: 2013-01-21 07:21 pm (UTC) - Expand

(no subject)

From: [identity profile] thedeemon.livejournal.com - Date: 2013-01-21 07:59 pm (UTC) - Expand

(no subject)

From: [identity profile] migmit.livejournal.com - Date: 2013-01-21 08:02 pm (UTC) - Expand

(no subject)

From: [identity profile] dima-starosud.livejournal.com - Date: 2013-01-21 08:47 pm (UTC) - Expand

(no subject)

From: [identity profile] migmit.livejournal.com - Date: 2013-01-21 09:23 pm (UTC) - Expand

(no subject)

From: [identity profile] dima-starosud.livejournal.com - Date: 2013-01-21 11:13 pm (UTC) - Expand

(no subject)

From: [identity profile] thedeemon.livejournal.com - Date: 2013-01-22 02:37 am (UTC) - Expand

(no subject)

From: [identity profile] dima-starosud.livejournal.com - Date: 2013-01-22 09:52 am (UTC) - Expand

(no subject)

From: [identity profile] thedeemon.livejournal.com - Date: 2013-01-22 10:27 am (UTC) - Expand

(no subject)

From: [identity profile] dima-starosud.livejournal.com - Date: 2013-01-22 11:02 am (UTC) - Expand

(no subject)

From: [identity profile] thedeemon.livejournal.com - Date: 2013-01-22 11:18 am (UTC) - Expand

(no subject)

From: [identity profile] dima-starosud.livejournal.com - Date: 2013-01-22 12:11 pm (UTC) - Expand

(no subject)

From: [identity profile] thedeemon.livejournal.com - Date: 2013-01-22 12:25 pm (UTC) - Expand

(no subject)

From: [identity profile] dima-starosud.livejournal.com - Date: 2013-01-22 12:38 pm (UTC) - Expand

(no subject)

From: [identity profile] thedeemon.livejournal.com - Date: 2013-01-22 01:30 pm (UTC) - Expand

(no subject)

From: [identity profile] dima-starosud.livejournal.com - Date: 2013-01-22 01:51 pm (UTC) - Expand

(no subject)

From: [identity profile] thedeemon.livejournal.com - Date: 2013-01-22 01:59 pm (UTC) - Expand

(no subject)

From: [identity profile] dima-starosud.livejournal.com - Date: 2013-01-22 02:06 pm (UTC) - Expand

(no subject)

From: [identity profile] thedeemon.livejournal.com - Date: 2013-01-22 02:24 pm (UTC) - Expand

(no subject)

From: [identity profile] dima-starosud.livejournal.com - Date: 2013-01-22 02:28 pm (UTC) - Expand

(no subject)

From: [identity profile] thedeemon.livejournal.com - Date: 2013-01-22 02:57 pm (UTC) - Expand

(no subject)

From: [identity profile] dima-starosud.livejournal.com - Date: 2013-01-22 03:17 pm (UTC) - Expand

(no subject)

From: [identity profile] thedeemon.livejournal.com - Date: 2013-01-22 03:39 pm (UTC) - Expand

(no subject)

From: [identity profile] dima-starosud.livejournal.com - Date: 2013-01-22 03:54 pm (UTC) - Expand

(no subject)

From: [identity profile] thedeemon.livejournal.com - Date: 2013-01-22 04:22 pm (UTC) - Expand

(no subject)

From: [identity profile] dima-starosud.livejournal.com - Date: 2013-01-22 05:00 pm (UTC) - Expand

(no subject)

From: [identity profile] thedeemon.livejournal.com - Date: 2013-01-22 05:12 pm (UTC) - Expand

(no subject)

From: [identity profile] dima-starosud.livejournal.com - Date: 2013-01-22 05:20 pm (UTC) - Expand

(no subject)

From: [identity profile] thedeemon.livejournal.com - Date: 2013-01-22 05:54 pm (UTC) - Expand

(no subject)

From: [identity profile] dima-starosud.livejournal.com - Date: 2013-01-22 06:27 pm (UTC) - Expand

(no subject)

From: [identity profile] thedeemon.livejournal.com - Date: 2013-01-22 06:50 pm (UTC) - Expand

(no subject)

From: [identity profile] dima-starosud.livejournal.com - Date: 2013-01-22 08:09 pm (UTC) - Expand

(no subject)

From: [identity profile] dima-starosud.livejournal.com - Date: 2013-01-22 12:50 pm (UTC) - Expand

(no subject)

From: [identity profile] sassa-nf.livejournal.com - Date: 2013-01-21 11:26 pm (UTC) - Expand

(no subject)

From: [identity profile] thedeemon.livejournal.com - Date: 2013-01-22 02:35 am (UTC) - Expand

(no subject)

From: [identity profile] sassa-nf.livejournal.com - Date: 2013-01-22 09:58 am (UTC) - Expand

(no subject)

From: [identity profile] thedeemon.livejournal.com - Date: 2013-01-22 10:38 am (UTC) - Expand

(no subject)

From: [identity profile] sassa-nf.livejournal.com - Date: 2013-01-22 10:57 am (UTC) - Expand

(no subject)

From: [identity profile] thedeemon.livejournal.com - Date: 2013-01-22 11:20 am (UTC) - Expand

(no subject)

From: [identity profile] sassa-nf.livejournal.com - Date: 2013-01-22 12:16 pm (UTC) - Expand

(no subject)

From: [identity profile] thedeemon.livejournal.com - Date: 2013-01-22 12:38 pm (UTC) - Expand

(no subject)

From: [identity profile] sassa-nf.livejournal.com - Date: 2013-01-22 01:13 pm (UTC) - Expand

(no subject)

From: [identity profile] thedeemon.livejournal.com - Date: 2013-01-22 01:32 pm (UTC) - Expand

(no subject)

From: [identity profile] sassa-nf.livejournal.com - Date: 2013-01-22 02:02 pm (UTC) - Expand

(no subject)

From: [identity profile] thedeemon.livejournal.com - Date: 2013-01-22 02:11 pm (UTC) - Expand

(no subject)

From: [identity profile] sassa-nf.livejournal.com - Date: 2013-01-22 02:55 pm (UTC) - Expand

(no subject)

From: [identity profile] thedeemon.livejournal.com - Date: 2013-01-22 03:05 pm (UTC) - Expand

(no subject)

From: [identity profile] sassa-nf.livejournal.com - Date: 2013-01-22 04:02 pm (UTC) - Expand

Date: 2013-01-21 07:57 pm (UTC)
From: [identity profile] thedeemon.livejournal.com
Фишка в том, что это получится уже просто тупл типа (А, True), который эквивалентен просто А, изоморфизмы между ними элементарнейшие. (считая True типом-синглтоном, как это кажется сделано в агде, но не в идрисе)

Date: 2013-01-21 11:05 am (UTC)
From: [identity profile] sassa-nf.livejournal.com
а как тип id6 должен выглядеть? я могу построить id6: (((x:A) -> B x) -> C) -> (x:A) -> (B x -> C)
id6 f = \x => g where
  g b = f (\y => b)
что только что было доказано изоморфно искомому?

Date: 2013-01-21 11:11 am (UTC)
From: [identity profile] sassa-nf.livejournal.com
а, это не одно и то же. сгодится только если (B x) одинаковое во всех местах в типе id6.

Date: 2013-01-21 11:12 am (UTC)
From: [identity profile] thedeemon.livejournal.com
Нужен
(((x:A) -> B x) -> C) -> (x:A ** (B x -> C))
Т.е. результатом должна быть зависимая пара, а не функция.

Date: 2013-01-21 11:14 am (UTC)
From: [identity profile] sassa-nf.livejournal.com
ну по id3 это не должно иметь значения?..

Date: 2013-01-21 11:20 am (UTC)
From: [identity profile] thedeemon.livejournal.com
не понял вопроса

Date: 2013-01-21 11:21 am (UTC)
From: [identity profile] sassa-nf.livejournal.com
нужен CPT?

id6 f = ( x ** g ) where
  g b = f g'
  g' x = b
чтобы ( x ** g ), x и b были из одного closure. (то есть, это ерунда, а не код, но идея такова)

Или это не CPT называется?
Edited Date: 2013-01-21 11:22 am (UTC)

Date: 2013-01-21 11:27 am (UTC)
From: [identity profile] thedeemon.livejournal.com
Надо подумать. Только рядом вон уже показали по всякому, что ничего не должно получаться.

Date: 2013-01-21 11:32 am (UTC)
From: [identity profile] sassa-nf.livejournal.com
Вот, или вот так
id6 f = ( x ** g ) where
  g b = f (\x => b)


Чтобы "вычислить" witness, нужно вызвать f, но "выскочить" из него, как только f передаёт готовый x (и continuation (B x->C)); чтобы g могло "вычислить" C, нужно в continuation вбросить proof, который должен "поступить" в g извне.

На пальцах - Я вам дам witness, а вы мне дайте proof, тогда я вам дам C. То есть, механизм доказательства оказыватся "снаружи" id6.

(no subject)

From: [identity profile] thedeemon.livejournal.com - Date: 2013-01-21 12:00 pm (UTC) - Expand

(no subject)

From: [identity profile] sassa-nf.livejournal.com - Date: 2013-01-21 12:11 pm (UTC) - Expand

(no subject)

From: [identity profile] sassa-nf.livejournal.com - Date: 2013-01-21 12:20 pm (UTC) - Expand

(no subject)

From: [identity profile] thedeemon.livejournal.com - Date: 2013-01-21 12:25 pm (UTC) - Expand

(no subject)

From: [identity profile] sassa-nf.livejournal.com - Date: 2013-01-21 12:35 pm (UTC) - Expand

(no subject)

From: [identity profile] deni-ok.livejournal.com - Date: 2013-01-21 01:29 pm (UTC) - Expand

(no subject)

From: [identity profile] dima-starosud.livejournal.com - Date: 2013-01-21 03:14 pm (UTC) - Expand

(no subject)

From: [identity profile] sassa-nf.livejournal.com - Date: 2013-01-21 05:33 pm (UTC) - Expand

(no subject)

From: [identity profile] sassa-nf.livejournal.com - Date: 2013-01-21 12:17 pm (UTC) - Expand

Date: 2013-01-21 11:43 am (UTC)
From: [identity profile] sassa-nf.livejournal.com
да оно получаться, наверное, и не должно. Например, нигде не сказано, что f "вызывает" свою функцию только один раз, хотя вполне может производить какое-то одно C.

(no subject)

From: [identity profile] migmit.livejournal.com - Date: 2013-01-21 08:01 pm (UTC) - Expand

(no subject)

From: [identity profile] sassa-nf.livejournal.com - Date: 2013-01-21 11:29 pm (UTC) - Expand

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. 7th, 2026 06:53 pm
Powered by Dreamwidth Studios