я реализовал три Законов в четверке Де Моргана в Haskell:Де Моргана в Haskell через Карри-Говарда заочного
notAandNotB :: (a -> c, b -> c) -> Either a b -> c
notAandNotB (f, g) (Left x) = f x
notAandNotB (f, g) (Right y) = g y
notAorB :: (Either a b -> c) -> (a -> c, b -> c)
notAorB f = (f . Left, f . Right)
notAorNotB :: Either (a -> c) (b -> c) -> (a, b) -> c
notAorNotB (Left f) (x, y) = f x
notAorNotB (Right g) (x, y) = g y
Однако, я не думаю, что это возможно осуществить последний закон (который имеет два жителя):
notAandBLeft :: ((a, b) -> c) -> Either (a -> c) (b -> c)
notAandBLeft f = Left (\a -> f (a, ?))
notAandBRight :: ((a, b) -> c) -> Either (a -> c) (b -> c)
notAandBRight f = Right (\b -> f (?, b))
Как я вижу, есть два возможных решения:
- Используйте
undefined
вместо?
. Это нехорошее решение, потому что это обман. Использовать мономорфные типы или ограниченные полиморфные типы для кодирования значения по умолчанию.
notAandBLeft :: Monoid b => ((a, b) -> c) -> Either (a -> c) (b -> c) notAandBLeft f = Left (\a -> f (a, mempty)) notAandBRight :: Monoid a => ((a, b) -> c) -> Either (a -> c) (b -> c) notAandBRight f = Right (\b -> f (mempty, b))
Это нехорошее решение, потому что это более слабый закон, чем закон Де Моргана.
Мы знаем, что законы Де Моргана верны, но правильно ли я предполагаю, что последний закон не может быть закодирован в Haskell? Что это говорит об изоморфизме Карри-Говарда? Это не является изоморфизмом, если каждое доказательство не может быть преобразовано в эквивалентную компьютерную программу, верно?
Я бы предположил, что вы неправильно применяете изоморфизм. –
Я не думаю, что неправильно применяю изоморфизм. Не могли бы вы уточнить? –
Обратите внимание, что эти формулы являются чисто пропозициональными (без кванторов). Поскольку пропозициональная интуиционистская логика разрешима, вы можете решить эти проблемы с помощью теоретического доказательства (например, Djinn). Если прорыв не удался, то это, безусловно, неинтуиционистская тавтология. – chi