Как я могу использовать конг и инъектив с индексированными векторами в Idris?

#vector #idris #theorem-proving

#вектор #идрис #доказательство теоремы

Вопрос:

cong и injective позволяют применять и не применять функции к равенствам:

 cong : (f : a -gt; b) -gt; x = y -gt; f x = f y  injective : Injective f =gt; f x = f y -gt; x = y  

Оба они не работают для индексированных векторов разной длины по очевидным причинам.

Как я могу доказать, что два равных вектора имеют одинаковую длину? Т. Е.

 sameLen : {xs : Vect n a} -gt; {ys : Vect m b} -gt; xs = ys -gt; n = m  

Я не могу просто сделать

 sameLen pf = cong length pf  

потому length что у on xs есть тип Vect n a -gt; Nat и length у on ys есть тип Vect m b -gt; Nat . (На самом деле, я даже не уверен, как доказать одно и то же для двух обычных List s, из-за разных аргументов типа, не говоря уже о добавленных индексах).

Идя другим путем, как бы я доказал что-то вроде

 data Rose a = V a | T (Vect n (Rose a)) Injective T where  injective Refl = Refl unwrap : {xs : Vect n (Rose a)} -gt; {ys : Vect m (Rose b)} -gt; T xs = T ys -gt; xs = ys  

Опять же, я не могу просто сделать

 unwrap pf = injective pf  

из-за различных типов T (один с m и один с n). И даже если бы у меня было доказательство m=n , как я мог бы использовать его, чтобы убедить Идриса в том, что два применения T одного и того же?

Ответ №1:

Получил ответ от Idris Discord — если вы соответствуете шаблону Refl , то он объединяется a и b автоматически:

 sameLen : {xs : List a} -gt; {ys : List b} -gt; xs = ys -gt; length xs = length ys sameLen Refl = Refl  sameLen' : {xs : Vect n a} -gt; {ys : Vect m b} -gt; xs = ys -gt; n = m sameLen' Refl = Refl