2015-06-16 6 views
1

Я пытаюсь написать следующую функцию:Agda: доказать, что, когда значения равны, то их аргументы конструктора равны

justEq : ∀ {A} -> (x y : A) -> (just x ≡ just y) -> (x ≡ y) 
justEq x y pf = {!!} 

Я не знаю, как написать это. Для меня это интуитивно для аксиоматики, но компилятор не принимает refl как доказательство этого.

Я, как правило, должен доказывать такие вещи, например, показывая, что если два непустых списка равны, то их головы равны.

Каков общий подход к этому вопросу? Связано ли это с «зеленым слизком» Конора Макбрайда о функциях в возвращении конструкторов?

+0

Вы пробовали сопоставление образцов на 'pf'? – Vitus

+0

emacs просто расширяет его до 'refl' ... Мне, вероятно, не хватает очевидного, но я не вижу, как это помогает. – jmite

+0

Мне кажется, что 'cong' будет полезен здесь, но я не знаю, как написать функцию, которая принимает' just x' в 'x', поскольку она по своей сути будет частичной. – jmite

ответ

3

Основой решения является сопоставление с образцом на pf быть reflвместе с используя точечный узор для y равен x (из-за типа refl!).

justEq : ∀ {A} -> (x y : A) -> (just x ≡ just y) -> (x ≡ y) 
justEq x .x refl = {!!} 

На данный момент, тип отверстия на правой стороне был унифицирован (x ≡ x) из-за y = .x равенства из сопоставления с образцом, то есть вы можете использовать refl как хорошо набранное значение, давая

justEq x .x refl = refl 

 Смежные вопросы

  • Нет связанных вопросов^_^