Подтвердить что ты не робот

Что недостает Haskell для проверки целостности?

Полный (функциональный) язык - это тот, в котором все может быть прекращено. Очевидно, что есть много мест, где я не хочу этого - иногда бывает полезно исключать исключения, веб-сервер не должен заканчиваться и т.д. Но иногда мне нужна локальная проверка совокупности, чтобы включить определенные оптимизации. Например, если у меня есть доказуемо общая функция

commutativity :: forall (n :: Nat) (m :: Nat). n + m :~: m + n
commutativity = ...

то, поскольку :~: имеет ровно один житель (Refl), GHC может оптимизировать

gcastWith (commutativity @n @m) someExpression
  ==>
someExpression

И мое доказательство коммутативности связано с тем, что стоимость выполнения O(n) является бесплатной. Итак, теперь для моего вопроса:

Каковы некоторые из тонких трудностей при создании проверки целостности для Haskell?

Очевидно, что такая контрольная панель консервативна, поэтому всякий раз, когда GHC не уверен, что что-то является тотальным (или нужно лениться проверять), он может предположить, что это не так... Похоже на то, что мне может быть не так сложно сгибаться вместе не очень умный контролер, который все равно будет очень полезен (по крайней мере, это должно быть просто, чтобы устранить все мои арифметические доказательства). Тем не менее, я не могу найти никаких попыток построить такую ​​вещь в GHC, поэтому, очевидно, я пропускаю некоторые довольно большие ограничения. Идите вперед, раздавите мои мечты.:)


Релевантно, но не последнее: Неудачный Haskell от Neil Mitchell, 2005.

4b9b3361

Ответ 1

Liquid Haskell имеет проверку целостности: https://github.com/ucsd-progsys/liquidhaskell#termination-check

Снимок экрана с главной страницы

По умолчанию проверка завершения выполняется для всех рекурсивных функций.

Используйте параметр no-term для отключения проверки

жидкость --no-term test.hs

В рекурсивных функциях первый алгебраический или целочисленный аргумент должен уменьшаться.

Значение уменьшения по умолчанию для списков - это длина и целое значение.

(я включил скриншот и цитату для потомков.)

Как и в Agda или других языках с проверкой целостности, аргументы функции должны со временем становиться структурно меньшими, чтобы достичь базового случая. В сочетании с системой проверки целостности это обеспечивает надежную проверку ряда функций. LH также помогает помогать контролеру, указывая, как вещи уменьшаются, что вы можете сделать с абстрактным типом данных, который непрозрачен или из FFI. Это действительно очень практично.