Ich versuche, einige einfache Dinge mit Idris zu beweisen, aber ich versage kläglich. Hier ist mein CodeIdris einfacher Beweis mit Listen
module MyReverse
%hide reverse
%default total
reverse : List a -> List a
reverse [] = []
reverse (x :: xs) = reverse xs ++ [x]
listEmptyAppend : (l : List a) -> [] ++ l = l
listEmptyAppend [] = Refl
listEmptyAppend (x :: xs) = Refl
listAppendEmpty : (l : List a) -> l ++ [] = l
listAppendEmpty [] = Refl
listAppendEmpty (x :: xs) = rewrite listAppendEmpty xs in Refl
list_append_eq : (l, l1, l2 : List a) -> l ++ l1 = l ++ l2 -> l1 = l2
list_append_eq l [] [] prf = Refl
list_append_eq l [] (x :: xs) prf = ?list_append_eq_rhs_1
list_append_eq l (x :: xs) [] prf = ?list_append_eq_rhs_2
list_append_eq l (x :: xs) (y :: ys) prf = ?list_append_eq_rhs_3
Das Ziel für ?list_append_eq_rhs_1
ist (nach ein paar intro'
s)
---------- Assumptions: ----------
a : Type
l : List a
x : a
xs : List a
prf : l ++ [] = l ++ x :: xs
---------- Goal: ----------
{hole0} : [] = x :: xs
Was ich tun möchte, ist prf
umschreiben die trivialen Sätze mit ich bewiesen haben, bis es genau ist Das Ziel, aber ich weiß nicht, wie ich das in Idris machen soll.
'cong {f = Drop 1} prf' funktioniert auch –