Date: 2015-06-16 06:40 pm (UTC)
ммм... мне кажется, это не совсем то.

Например, когда я на агде доказывал, что реверс списка - это пермутация, то у меня было два типа:

  data insert_into_==_ {A : Set} (x : A) : List A -> List A -> Set where
    iihead : (xs : List A) -> insert x into xs == (x :: xs)
    iimid  : (xs : List A) -> (hs : List A) -> (h : A) -> insert x into xs == hs -> insert x into (h :: xs) == (h :: hs)


и

  data Permutation {A : Set} : List A -> List A -> Set where
    pnil : Permutation nil nil
    p::  : forall {xs zs ys} -> (x : A) -> (y : A) -> insert y into zs == ys -> x == y -> Permutation xs zs -> Permutation (x :: xs) ys


Кажется, в Permutation можно и обойтись без x == y, а вот insert x into xs == ys всё-таки требует зависимого типа от x:A, чтобы insert 0 into xs == ys и insert 1 into xs == ys были отличимы на уровне компилирования - т.е. придётся моделировать и типы элементов списка, не только Nat.

Хотя, может, на самом деле можно как-то и обойтись.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting