2016-01-18 4 views
2

Редактирование: Я обнаружил, что если я встраиваю определение t1 напрямую, этот тип проверяется просто отлично. Таким образом, кажется, что определение обрабатывает t1 как только неизвестную переменную, а не как мое фактическое более раннее определение. Есть ли способ заставить это?Функция проверки оценивается как True в Idris

Предисловие: Я полностью понимаю, что это не идиоматический способ написать это. Я просто хочу понять, что здесь происходит конкретно.

Я написал тривиальное реализацию бинарного дерева и функции elemBT которая проверяет, содержит ли дерево конкретный элемент и оценивающего к Boolean (думаю elem функции в Haskell, для бинарных деревьев, за исключением).

t1 : BT Nat 
t1 = Node 5 Nil Nil 

elemBT : Eq a => a -> BT a -> Bool 

> elemBT 5 t1 
True : Bool 

Теперь, когда я знаю, что elemBT оценивает в True, я ожидаю, чтобы иметь возможность написать очень простое заявление, которое доказывает, что, выполнив следующие действия.

t1contains5 : elemBT 5 t1 = True 
t1contains5 = Refl 

Неожиданно это приводит к сбою объединения. Тем не менее, я могу сделать почти то же самое, используя встроенные списки.

junk : elem 5 [1,5] = True 
junk = Refl 

И этот тип проверяет как ожидалось. Почему мой пример с бинарными деревьями работает одинаково?

Спасибо.

ответ

4

Я сам решил это. Оказывается, что сравнительно недавно (возможно, в конце 2015 года) было внесено изменение в Идрис, который рассматривает любую строчную, потенциально неявную переменную как неявную. Если я использую T1, то эта проблема полностью исчезнет.

Дальнейшие обсуждения в Github repository here