deniok: (ухмыляюсь)
[personal profile] deniok
Как можно конструктивно доказать, что число 4 является полным квадратом некоторого натурального числа? Предъявив такое число n, для которого n * n = 4. И мы знаем такое число, но никому не скажем, что это 2. Обобщим это наблюдение, введя бинарное отношение принадлежности величины образу функции f как тип данных Агды
data Image_∋_ {X Y : Set}(f : X → Y) : Y → Set where
  im : (x : X) → Image f ∋ f x
Наличие всего одного конструктора отражает тот факт, что единственный способ сконструировать элемент образа f - выбрать аргумент x и применить f к этому x. Например, рассматривая функции
square : ℕ → ℕ
square n = n * n
и
cube  : ℕ → ℕ
cube n = n * n * n
легко заметить, что im 2 может выступить свидетельством того, что образ square содержит 4
lem-4-is-square : Image square ∋ 4
lem-4-is-square = im 2
или того, что образ cube содержит 8
lem-8-is-cube : Image cube ∋ 8
lem-8-is-cube = im 2

Перейдём теперь к построению обратной функции. Обратная к f функция может иметь в качестве области определения не все значения из Y, а только те, что принадлежат образу f. Чтобы Агда могла проконтролировать этот факт, мы должны, помимо самой функции и аргумента, передать ещё и соответствующий объект-свидетельство про этот аргумент
inv : {X Y : Set}(f : X → Y)(y : Y) → Image f ∋ y → X
inv f .(f x) (im x) = x
Теперь можно посчитать значение функции, обратной к квадрату в точке 4
my-value-is-2 : ℕ
my-value-is-2 = inv square 4 lem-4-is-square
и функции, обратной к кубу в точке 8
my-value-is-2-too : ℕ
my-value-is-2-too = inv cube 8 lem-8-is-cube
Если же мы попробуем написать
i-am-not-a-nat = inv square 5 {! !}
то Агда затребует от нас сконструировать для дырки объект ?0 : Image square ∋ 5, необитаемость которого очевидна.

Ремарка. Точечный образец в определении inv необходим для подсказки компилятору о том, что после связывания f в первом аргументе и x - в третьем единственное корректное значение второго аргумента это (f x).

Date: 2012-12-25 10:03 am (UTC)
From: [identity profile] thedeemon.livejournal.com
Занятно, но совершенно бесполезно же - чтобы вычислить обратное значение, надо его же предоставить аргументом.

Вопрос: а можно ли сделать таблицу - массив/список, где n-ный элемент будет содержать Image f ∋ n? В ATS я подобное делал, но через хак по сути.

Date: 2012-12-25 10:12 am (UTC)
From: [identity profile] deni-ok.livejournal.com
А что этот массив будет содержать для ненаселенных Image f ∋ n? Например, для Image square ∋ 5?

Date: 2012-12-25 10:21 am (UTC)
From: [identity profile] thedeemon.livejournal.com
Тут я плохо сформулировал, имелось в виду скорее Image f ∋ (f n).

Date: 2012-12-25 03:44 pm (UTC)
From: [identity profile] deni-ok.livejournal.com
Ну проще всего воспользоваться квантором существования (то есть зависимой парой, если размышлять на уровне термов):
list-by-hand : List (∃ λ n → Image square ∋ n) 
list-by-hand = (4 , im 2) ∷ (1 , im 1) ∷ (0 , im 0) ∷ []
Теперь обобщаем до заказываемой пользователем длины
list-of-squares : ℕ → List (∃ λ n → Image square ∋ n) 
list-of-squares = Data.List.map ( λ x  → square x , im x) ∘ downFrom 
Ну и, абстрагируясь от square, получим
list-of-images : {Y : Set}(f : ℕ → Y) → ℕ → List (∃ λ n → Image f ∋ n) 
list-of-images f = Data.List.map ( λ x  → f x , im x) ∘ downFrom 

Date: 2012-12-25 03:58 pm (UTC)
From: [identity profile] thedeemon.livejournal.com
Могу ли я теперь из него получить Image f ∋ (f n), взяв n-ый элемент? А за О(1)? Фактически, мне нужна мемоизация доказательств, чтобы получать Image f ∋ (f n), не вычисляя f n каждый раз.

Date: 2012-12-25 04:34 pm (UTC)
From: [identity profile] deni-ok.livejournal.com
Расскажу, что знаю, хотя знаю немного.

Собственно в паре как раз и хранится (f n , n), если убрать все типовые украшательства. А дальше все асимптотики зависят от контейнера и бэкенда. У списка в Агдочке ты фиг возьмёшь n-ый элемент, ибо нетотально. Остаётся вектор (ну или что-то более эффективное из Х. поднять, но я это не очень пробовал).

Теперь бэкенды, говорят, что их три: (1) MAlonzo - это компиляция в Хаскель (GHC),
(2) JavaScript, (3) Epic - бэкенд общий для Idris и Epigram от Edwin Brady.

Цитата из Nils Anders Danielsson (http://comments.gmane.org/gmane.comp.lang.agda/3424):
Agda compilers are free to choose whatever evaluation order they like,
as long as they don't change the meaning of the program. The JavaScript
and Epic backends currently use strict evaluation (for inductive types),
whereas the MAlonzo backend uses lazy evaluation (modulo whatever
strictness optimisations GHC applies).

Date: 2012-12-25 04:49 pm (UTC)
From: [identity profile] thedeemon.livejournal.com
Просто мне показалось, что в типе того списка потерялось соответствие индексов содержанию. Как вообще записывается тип списка или вектора, где тип элемента зависит от его индекса?

Date: 2012-12-25 05:20 pm (UTC)
From: [identity profile] deni-ok.livejournal.com
Так тип-то для элементов один: ∃ λ n → Image square ∋ n. Он утверждает "существует n, такое что оно принадлежит образу square" (и мы их знаем много 0, 1, 4, 9, ...). А дальше мы оформляем в виде списка семейство разных доказательств этого факта, индексированное натуральными, чтобы автоматизировать добавление доказательств, а не писать их ручками по одному. Причём элементы списка - это зависимые пары из числа, населяющего образ square, и объекта-свидетельства, что высказывание верно для этого числа, например, (9 , im 3).

Насчёт того, что в типе того списка потерялось соответствие индексов содержанию. В списке же нельзя хранить негомогенизированное (тем или иным способом), иначе это уже будет кортеж:
test : Image square ∋ 0 × Image square ∋ 1 × Image square ∋ 4
test = im 0 , im 1 , im 2

(no subject)

From: [identity profile] thedeemon.livejournal.com - Date: 2012-12-25 05:38 pm (UTC) - Expand

(no subject)

From: [identity profile] deni-ok.livejournal.com - Date: 2012-12-25 07:32 pm (UTC) - Expand

(no subject)

From: [identity profile] thedeemon.livejournal.com - Date: 2012-12-26 06:16 am (UTC) - Expand

(no subject)

From: [identity profile] deni-ok.livejournal.com - Date: 2012-12-26 06:42 am (UTC) - Expand

(no subject)

From: [identity profile] thedeemon.livejournal.com - Date: 2012-12-26 06:48 am (UTC) - Expand

(no subject)

From: [identity profile] deni-ok.livejournal.com - Date: 2012-12-26 07:25 am (UTC) - Expand

(no subject)

From: [identity profile] thedeemon.livejournal.com - Date: 2012-12-26 07:32 am (UTC) - Expand

Date: 2012-12-25 04:54 pm (UTC)
From: [identity profile] thedeemon.livejournal.com
Кстати, какие есть доводы насчет Idris vs. Agda? Есть ли смысл браться за идрис вместо агды, и если нет, нафига он создавался?

(no subject)

From: [identity profile] deni-ok.livejournal.com - Date: 2012-12-25 05:01 pm (UTC) - Expand

(no subject)

From: [identity profile] nivanych.livejournal.com - Date: 2012-12-28 10:00 am (UTC) - Expand

(no subject)

From: [identity profile] thedeemon.livejournal.com - Date: 2012-12-28 11:27 am (UTC) - Expand

(no subject)

From: [identity profile] nivanych.livejournal.com - Date: 2012-12-28 12:07 pm (UTC) - Expand

(no subject)

From: [identity profile] miserakl.livejournal.com - Date: 2012-12-30 08:47 am (UTC) - Expand

(no subject)

From: [identity profile] nivanych.livejournal.com - Date: 2012-12-30 09:20 am (UTC) - Expand

(no subject)

From: [identity profile] miserakl.livejournal.com - Date: 2012-12-30 09:53 am (UTC) - Expand

(no subject)

From: [identity profile] nivanych.livejournal.com - Date: 2012-12-30 10:06 am (UTC) - Expand

(no subject)

From: [identity profile] miserakl.livejournal.com - Date: 2012-12-30 10:35 am (UTC) - Expand

(no subject)

From: [identity profile] nivanych.livejournal.com - Date: 2012-12-30 10:42 am (UTC) - Expand

(no subject)

From: [identity profile] miserakl.livejournal.com - Date: 2012-12-30 12:31 pm (UTC) - Expand

(no subject)

From: [identity profile] nivanych.livejournal.com - Date: 2012-12-30 01:21 pm (UTC) - Expand

(no subject)

From: [identity profile] miserakl.livejournal.com - Date: 2012-12-30 01:31 pm (UTC) - Expand

(no subject)

From: [identity profile] nivanych.livejournal.com - Date: 2012-12-30 01:48 pm (UTC) - Expand

(no subject)

From: [identity profile] miserakl.livejournal.com - Date: 2012-12-30 03:06 pm (UTC) - Expand

(no subject)

From: [identity profile] nivanych.livejournal.com - Date: 2012-12-30 03:27 pm (UTC) - Expand

(no subject)

From: [identity profile] miserakl.livejournal.com - Date: 2012-12-30 04:01 pm (UTC) - Expand

(no subject)

From: [identity profile] nivanych.livejournal.com - Date: 2012-12-30 04:07 pm (UTC) - Expand

(no subject)

From: [identity profile] thesz.livejournal.com - Date: 2012-12-30 01:52 pm (UTC) - Expand

Date: 2012-12-25 10:03 am (UTC)
From: [identity profile] thedeemon.livejournal.com
И еще вопрос: как в Агде с линейными типами?

Date: 2012-12-25 10:14 am (UTC)
From: [identity profile] deni-ok.livejournal.com
Ничего не слышал. Интересно подумать над тем, как можно было бы реализовать.

Date: 2012-12-25 11:22 am (UTC)
From: [identity profile] nivanych.livejournal.com
Вроде, были где-то, надо поискать.

Date: 2012-12-26 07:49 pm (UTC)
From: [identity profile] dmytro starosud (from livejournal.com)
Я когда-то искал, даже в Агда-мейл-лист писал - глухо:(
Но вы поищите, может я недосмотрел.

Date: 2012-12-28 10:12 am (UTC)
From: [identity profile] nivanych.livejournal.com
Ну не совсем, но тоже интересно —
Towards a Common Categorical Semantics for Linear-Time Temporal Logic and Functional Reactive Programming
http://www.ioc.ee/~wolfgang/research/mfps-2012-paper.pdf
http://www.ioc.ee/~wolfgang/research/mfps-2012-slides.pdf

Date: 2012-12-28 10:17 am (UTC)
From: [identity profile] nivanych.livejournal.com
Не, ну можно же посмотреть ссылки с их сайта —
http://wiki.portal.chalmers.se/agda/pmwiki.php?n=Main.Libraries
Там много интересного и рядом с этими темами тоже.
Например, IO внутри моноидальной категории со сплетениями.

Date: 2012-12-30 10:17 am (UTC)
From: [identity profile] dmytro starosud (from livejournal.com)
"IO внутри моноидальной категории со сплетениями"
=( Это очень больно, я не знаю таких слов.
...но обязательно посмотрю.

Date: 2012-12-30 10:22 am (UTC)
From: [identity profile] nivanych.livejournal.com
Не преувеличивайте, вовсе это не больно. Раз, и всё!
А код там внутри несложный. Правда, практические аспекты в сторону линейной логики там не развиты.

(no subject)

From: [identity profile] dmytro starosud - Date: 2012-12-30 11:20 am (UTC) - Expand

(no subject)

From: [identity profile] nivanych.livejournal.com - Date: 2012-12-30 11:46 am (UTC) - Expand

Date: 2012-12-26 07:46 pm (UTC)
From: [identity profile] dmytro starosud (from livejournal.com)
Я уже начал:) Будет пруфовконсепт - поделюсь.

Date: 2012-12-26 07:51 pm (UTC)
From: [identity profile] deni-ok.livejournal.com
Да, будет здорово. Держите в курсе достижений, и если затыки будут - тоже делитесь.

Date: 2012-12-26 07:54 pm (UTC)
From: [identity profile] dmytro starosud (from livejournal.com)
Непременно.

Date: 2012-12-28 10:20 am (UTC)
From: [identity profile] nivanych.livejournal.com
Агдочковый курс —
http://www.cs.nott.ac.uk/~txa/g53cfr/
Если делать свой курс, то на этот стоит обратить внимание.

Date: 2012-12-28 10:58 am (UTC)
From: [identity profile] deni-ok.livejournal.com
Да, спасибо, хороший курс и организован разумно. У нас магистры перегружены, я сомневаюсь, что мне дадут слот под это дело. Может для аспирантов спецкурс удастся сделать, но мне ещё надо некоторое время самому пооттачивать кунг-фу.

Date: 2012-12-30 09:12 am (UTC)
From: [identity profile] nivanych.livejournal.com
А у вас есть более несколько народу, кому это интересно?

Date: 2012-12-30 09:19 am (UTC)
From: [identity profile] deni-ok.livejournal.com
Несколько, думаю, наберётся, а больше зачем?

Date: 2012-12-30 09:21 am (UTC)
From: [identity profile] nivanych.livejournal.com
;-) Это просто такая форма вопроса про оценку количества людей, кому это будет интересно.

Profile

deniok: (Default)
deniok

February 2022

S M T W T F S
  12345
6789101112
13141516171819
20212223 242526
2728     

Style Credit

Expand Cut Tags

No cut tags
Page generated Aug. 15th, 2025 03:46 pm
Powered by Dreamwidth Studios