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

Oct 05, 2014 09:23

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

UPD. Стоит напомнить, что изоморфизм Карри-Говарда имеет место между интуиционистской версией пропозициональной логики и подмножеством ( Read more... )

сборник задач и упражнений по матлогике, сборник задач и упражнений по Хаскелю

Leave a comment

Comments 13

ex_juan_gan October 5 2014, 05:34:53 UTC
Прелесть какая. А как это в Хаскеле "верность интуиционистски" вообще доказывается? Уж не написанием ли кода?

Reply

deni_ok October 5 2014, 05:52:17 UTC
Да, именно так. Но, конечно, на подмножестве Хаскеля без рекурсии , иначе система not sound: fix :: (a -> a) -> a.

Reply

migmit October 6 2014, 05:28:41 UTC
И без рекурсивных типов в том числе.

Reply

deni_ok October 6 2014, 05:34:27 UTC
Да, data Mu f = In (f (Mu f)) и тому подобное тоже, конечно, все попортит.

Reply


rvp74 October 5 2014, 08:04:29 UTC
для первого как-то сразу код в голову пришел:

ex1 :: (a -> c, b -> c) -> Either a b -> c
ex1 (f,g) = h where
h (Left l) = f l
h (Right r) = g r

Reply


rvp74 October 5 2014, 08:56:21 UTC
второй почему-то сразу не дался, но решение оказалось еще проще:

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

Reply


voidex October 5 2014, 09:25:52 UTC
1.
uncurry (|||)
2.
(. Left) &&& (. Right)

Reply

deni_ok October 5 2014, 15:50:08 UTC
Стрелочник.

Reply


sassa_nf October 5 2014, 09:52:49 UTC

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)

Reply

deni_ok October 5 2014, 15:50:43 UTC
Еще один стрелочник.

Reply


Leave a comment

Up