Немного трудно быть уверенным в том, что вы хотите делать без дополнительного контекста, но inline
действительно не работает с рекурсивными функциями: inline
позволяет вам использовать функцию типа , расширяя ее ввремя компиляции (до создания условия проверки, отправляемого в решатель), поэтому необходимо иметь возможность заменить каждое вхождение ordLT a b
какой-то определенной логической формулой (что невозможно, поскольку это рекурсивно).
Если вам нужно использовать произвольные функции Haskell в логике, вы можете изучить использование Refinement Reflection.Ваш пример компилируется с {-@ reflect ordLT @-}
и {-@ LIQUID "--exact-data-cons" @-}
.Однако символы функций, созданные с помощью уточненного отражения, не полностью интерпретируются в логике.Мельчайшие подробности обсуждаются в этой статье , а более доступные примеры / объяснения представлены в этих слайдах и в этом посте .Главное, что нужно помнить, это то, что символ ordLT
, созданный с помощью отражения, первоначально будет рассматриваться как совершенно не интерпретируемая функция в логике: единственное, что LH знает об этом, это что-то вроде a0 == a1 ==> b0 == b1 ==> ordLT a0 b0 == ordLT a1 b1
(если вы вызываете его на идентичных входах(результаты идентичны).
Чтобы сделать что-то полезное с ordLT
в логике, вам нужно будет вызвать ordLT
на уровне значений где-то в области видимости, который покажет значениеэтот конкретный вызов, поскольку тип возвращаемого значения ordLT
(функция уровня значения) утверждает что-то о выводе ordLT
(неинтерпретируемой функции логического уровня) на этих входах.Примеры приведены в слайдах, связанных выше, и в документе.Надеюсь, этого достаточно, чтобы вы начали!