theory ToyList = PreList: text {* Achtung: Wir verwenden ausnahmsweise (!) nicht die Main-Theorie von HOL, um Kollision mit dem vorhandenen Listen-Typ zu vermeiden. *} datatype 'a list = Nil | Cons 'a "'a list" consts app :: "'a list => 'a list => 'a list" rev :: "'a list => 'a list" primrec "app Nil ys = ys" "app (Cons x xs) ys = Cons x (app xs ys)" primrec "rev Nil = Nil" "rev (Cons x xs) = app (rev xs) (Cons x Nil)" text {* Einfache Beweis-Skripten in Isabelle. Kommando 'lemma' / 'theorem': Behauptung auf Theorie-Ebene -- Start eines Beweises. Attribut 'simp': Verwende Theoreme in Zukunft zur Vereinfachung. Methode 'induct_tac': Strukturelle Induktion ueber eine Variable. Methode 'auto': Automatischer Beweis (durch Vereinfachen etc). Kommando 'done': Beweis zu Ende. *} lemma [simp]: "app xs Nil = xs" apply (induct_tac xs) apply auto done lemma [simp]: "app (app xs ys) zs = app xs (app ys zs)" apply (induct_tac xs) apply auto done lemma [simp]: "rev (app xs ys) = app (rev ys) (rev xs)" apply (induct_tac xs) apply auto done theorem rev_rev: "rev (rev xs) = xs" apply (induct_tac xs) apply auto done end