deniok: (typed lambda)
deniok ([personal profile] deniok) wrote2014-10-05 09:23 am

Простые задачки на Карри-Говарда

Доказать, используя Хаскель, что следующие тавтологии верны интуиционистски
(a -> c) /\ (b -> c) -> a \/ b -> c
(a \/ b -> c) -> (a -> c) /\ (b -> c)
(Понятно, что конъюнкция - это пара, а дизъюнкция - Either.)

UPD. Стоит напомнить, что изоморфизм Карри-Говарда имеет место между интуиционистской версией пропозициональной логики и подмножеством Хаскеля без рекурсии. То есть использовать рекурсию нельзя - ни явно, ни неявно. Ну и определение отрицания требует в Хаскелле некоторых хаков, но при доказательстве этих формул оно не требуется.

[identity profile] juan-gandhi.livejournal.com 2014-10-05 05:34 am (UTC)(link)
Прелесть какая. А как это в Хаскеле "верность интуиционистски" вообще доказывается? Уж не написанием ли кода?

[identity profile] deni-ok.livejournal.com 2014-10-05 05:52 am (UTC)(link)
Да, именно так. Но, конечно, на подмножестве Хаскеля без рекурсии , иначе система not sound: fix :: (a -> a) -> a.

[identity profile] rvp74.livejournal.com 2014-10-05 08:04 am (UTC)(link)
для первого как-то сразу код в голову пришел:

ex1 :: (a -> c, b -> c) -> Either a b -> c
ex1 (f,g) = h where
   h (Left l) = f l
   h (Right r) = g r
Edited 2014-10-05 21:22 (UTC)

[identity profile] rvp74.livejournal.com 2014-10-05 08:56 am (UTC)(link)
второй почему-то сразу не дался, но решение оказалось еще проще:

ex2 :: (Either a b -> c) -> (a -> c, b -> c)
ex2 h = (h . Left, h . Right)

[identity profile] voidex.livejournal.com 2014-10-05 09:25 am (UTC)(link)
1.
uncurry (|||)

2.
(. Left) &&& (. Right)

[identity profile] sassa-nf.livejournal.com 2014-10-05 09:52 am (UTC)(link)
import Control.Arrow
f :: (a->c, b->c) -> Either a b -> c
f = uncurry (|||)

g :: (Either a b -> c) -> (a->c, b->c)
g = (.Left) &&& (.Right)

[identity profile] gds.livejournal.com 2014-10-05 12:17 pm (UTC)(link)
мой вариант:
Extraction Language Haskell.

Inductive Either A B := Left : A -> Either A B | Right : B -> Either A B.

Extraction Inline prod_rect.
Extraction Inline Either_rect.

Lemma l1 : forall a b c,
(a -> c) * (b -> c) -> Either a b -> c.
firstorder.
Defined.
Extraction l1.

Lemma l2 : forall a b c,
(Either a b -> c) -> (a -> c) * (b -> c).
firstorder.
Defined.
Extraction l2.


(результат в отдельной пасте, http://pastebin.com/H2T1cw7B , чтобы не спойлерить.)
(до канонiчного можно довести, указав, во что экстрактить Prod и Pair.)

[identity profile] deni-ok.livejournal.com 2014-10-05 03:50 pm (UTC)(link)
Стрелочник.

[identity profile] deni-ok.livejournal.com 2014-10-05 03:50 pm (UTC)(link)
Еще один стрелочник.

[identity profile] migmit.livejournal.com 2014-10-06 05:28 am (UTC)(link)
И без рекурсивных типов в том числе.

[identity profile] deni-ok.livejournal.com 2014-10-06 05:34 am (UTC)(link)
Да, data Mu f = In (f (Mu f)) и тому подобное тоже, конечно, все попортит.

[identity profile] nponeccop.livejournal.com 2014-10-06 01:52 pm (UTC)(link)
Ну, если быть педантичным, то и без unsafeCoerse, неполных кейсов и всяких странных констант вроде undefined, error, Control.Exception.throw и т. д.

Даже оговорка о Хиндли-Милнере будет неточна, потому что есть его версия с расширением имени Майкрофта, дающая рекурсию.

Проще уж написать маленький парсер с тайпчекером, и для него задания формулировать :) Чтобы никакая противоречивость уж точно не просочилась.

[identity profile] deni-ok.livejournal.com 2014-10-06 02:43 pm (UTC)(link)
Проще, конечно, было попросить сделать все на Агде, но это, боюсь, сузило бы аудиторию. И хотя Хаскель не заточен напрямую под доказательства, по факту все, кто тут сделал задачку, вполне себе ограничились допустимыми средствами.