Обратная функция на Агде
Dec. 25th, 2012 02:36 am![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Как можно конструктивно доказать, что число 4 является полным квадратом некоторого натурального числа? Предъявив такое число n, для которого n * n = 4. И мы знаем такое число, но никому не скажем, что это 2. Обобщим это наблюдение, введя бинарное отношение принадлежности величины образу функции f как тип данных Агды
Перейдём теперь к построению обратной функции. Обратная к f функция может иметь в качестве области определения не все значения из Y, а только те, что принадлежат образу f. Чтобы Агда могла проконтролировать этот факт, мы должны, помимо самой функции и аргумента, передать ещё и соответствующий объект-свидетельство про этот аргумент
Ремарка. Точечный образец в определении inv необходим для подсказки компилятору о том, что после связывания f в первом аргументе и x - в третьем единственное корректное значение второго аргумента это (f x).
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).
no subject
Date: 2012-12-25 10:03 am (UTC)Вопрос: а можно ли сделать таблицу - массив/список, где n-ный элемент будет содержать Image f ∋ n? В ATS я подобное делал, но через хак по сути.
no subject
Date: 2012-12-25 10:12 am (UTC)no subject
Date: 2012-12-25 10:21 am (UTC)no subject
Date: 2012-12-25 03:44 pm (UTC)Теперь обобщаем до заказываемой пользователем длины
Ну и, абстрагируясь от square, получим
no subject
Date: 2012-12-25 03:58 pm (UTC)no subject
Date: 2012-12-25 04:34 pm (UTC)Собственно в паре как раз и хранится (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).
no subject
Date: 2012-12-25 04:49 pm (UTC)no subject
Date: 2012-12-25 05:20 pm (UTC)Насчёт того, что в типе того списка потерялось соответствие индексов содержанию. В списке же нельзя хранить негомогенизированное (тем или иным способом), иначе это уже будет кортеж:
(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2012-12-25 04:54 pm (UTC)(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2012-12-25 10:03 am (UTC)no subject
Date: 2012-12-25 10:14 am (UTC)no subject
Date: 2012-12-25 11:22 am (UTC)no subject
Date: 2012-12-26 07:49 pm (UTC)Но вы поищите, может я недосмотрел.
no subject
Date: 2012-12-28 10:12 am (UTC)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
no subject
Date: 2012-12-28 10:17 am (UTC)http://wiki.portal.chalmers.se/agda/pmwiki.php?n=Main.Libraries
Там много интересного и рядом с этими темами тоже.
Например, IO внутри моноидальной категории со сплетениями.
no subject
Date: 2012-12-30 10:17 am (UTC)=( Это очень больно, я не знаю таких слов.
...но обязательно посмотрю.
no subject
Date: 2012-12-30 10:22 am (UTC)А код там внутри несложный. Правда, практические аспекты в сторону линейной логики там не развиты.
(no subject)
From:(no subject)
From:no subject
Date: 2012-12-26 07:46 pm (UTC)no subject
Date: 2012-12-26 07:51 pm (UTC)no subject
Date: 2012-12-26 07:54 pm (UTC)no subject
Date: 2012-12-28 10:20 am (UTC)http://www.cs.nott.ac.uk/~txa/g53cfr/
Если делать свой курс, то на этот стоит обратить внимание.
no subject
Date: 2012-12-28 10:58 am (UTC)no subject
Date: 2012-12-30 09:12 am (UTC)no subject
Date: 2012-12-30 09:19 am (UTC)no subject
Date: 2012-12-30 09:21 am (UTC)