# HG changeset patch # User nipkow # Date 1200307557 -3600 # Node ID f344ff9e2041de84bd63cbea72e002fd79d51197 # Parent d8f17d8cf9d4a0f47291cd52307c6aff1e5c66f9 *** empty log message *** diff -r d8f17d8cf9d4 -r f344ff9e2041 src/HOL/Library/Library.thy --- a/src/HOL/Library/Library.thy Mon Jan 14 03:58:30 2008 +0100 +++ b/src/HOL/Library/Library.thy Mon Jan 14 11:45:57 2008 +0100 @@ -20,6 +20,7 @@ FuncSet GCD Infinite_Set + ListSpace Multiset NatPair Nat_Infinity diff -r d8f17d8cf9d4 -r f344ff9e2041 src/HOL/Library/ListSpace.thy --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/HOL/Library/ListSpace.thy Mon Jan 14 11:45:57 2008 +0100 @@ -0,0 +1,134 @@ +(* ID: $Id$ + Author: Tobias Nipkow, 2007 +*) + +header "Lists as vectors" + +theory ListSpace +imports Main +begin + +text{* \noindent +A vector-space like structure of lists and arithmetic operations on them. +Is only a vector space if restricted to lists of the same length. *} + +text{* Multiplication with a scalar: *} + +abbreviation scale :: "('a::times) \ 'a list \ 'a list" (infix "*\<^sub>s" 70) +where "x *\<^sub>s xs \ map (op * x) xs" + +lemma scale1[simp]: "(1::'a::monoid_mult) *\<^sub>s xs = xs" +by (induct xs) simp_all + +subsection {* @{text"+"} and @{text"-"} *} + +fun zipwith0 :: "('a::zero \ 'b::zero \ 'c) \ 'a list \ 'b list \ 'c list" +where +"zipwith0 f [] [] = []" | +"zipwith0 f (x#xs) (y#ys) = f x y # zipwith0 f xs ys" | +"zipwith0 f (x#xs) [] = f x 0 # zipwith0 f xs []" | +"zipwith0 f [] (y#ys) = f 0 y # zipwith0 f [] ys" + +instance list :: ("{zero,plus}")plus +list_add_def : "op + \ zipwith0 (op +)" .. + +instance list :: ("{zero,uminus}")uminus +list_uminus_def: "uminus \ map uminus" .. + +instance list :: ("{zero,minus}")minus +list_diff_def: "op - \ zipwith0 (op -)" .. + +lemma zipwith0_Nil[simp]: "zipwith0 f [] ys = map (f 0) ys" +by(induct ys) simp_all + + +lemma list_add_Nil[simp]: "[] + xs = (xs::'a::monoid_add list)" +by (induct xs) (auto simp:list_add_def) + +lemma list_add_Nil2[simp]: "xs + [] = (xs::'a::monoid_add list)" +by (induct xs) (auto simp:list_add_def) + +lemma list_add_Cons[simp]: "(x#xs) + (y#ys) = (x+y)#(xs+ys)" +by(auto simp:list_add_def) + +lemma list_diff_Nil[simp]: "[] - xs = -(xs::'a::group_add list)" +by (induct xs) (auto simp:list_diff_def list_uminus_def) + +lemma list_diff_Nil2[simp]: "xs - [] = (xs::'a::group_add list)" +by (induct xs) (auto simp:list_diff_def) + +lemma list_diff_Cons_Cons[simp]: "(x#xs) - (y#ys) = (x-y)#(xs-ys)" +by (induct xs) (auto simp:list_diff_def) + +lemma list_uminus_Cons[simp]: "-(x#xs) = (-x)#(-xs)" +by (induct xs) (auto simp:list_uminus_def) + +lemma self_list_diff: + "xs - xs = replicate (length(xs::'a::group_add list)) 0" +by(induct xs) simp_all + +lemma list_add_assoc: fixes xs :: "'a::monoid_add list" +shows "(xs+ys)+zs = xs+(ys+zs)" +apply(induct xs arbitrary: ys zs) + apply simp +apply(case_tac ys) + apply(simp) +apply(simp) +apply(case_tac zs) + apply(simp) +apply(simp add:add_assoc) +done + +subsection "Inner product" + +definition iprod :: "'a::ring list \ 'a list \ 'a" ("\_,_\") where +"\xs,ys\ = (\(x,y) \ zip xs ys. x*y)" + +lemma iprod_Nil[simp]: "\[],ys\ = 0" +by(simp add:iprod_def) + +lemma iprod_Nil2[simp]: "\xs,[]\ = 0" +by(simp add:iprod_def) + +lemma iprod_Cons[simp]: "\x#xs,y#ys\ = x*y + \xs,ys\" +by(simp add:iprod_def) + +lemma iprod0_if_coeffs0: "\c\set cs. c = 0 \ \cs,xs\ = 0" +apply(induct cs arbitrary:xs) + apply simp +apply(case_tac xs) apply simp +apply auto +done + +lemma iprod_uminus[simp]: "\-xs,ys\ = -\xs,ys\" +by(simp add: iprod_def uminus_listsum_map o_def split_def map_zip_map list_uminus_def) + +lemma iprod_left_add_distrib: "\xs + ys,zs\ = \xs,zs\ + \ys,zs\" +apply(induct xs arbitrary: ys zs) +apply (simp add: o_def split_def) +apply(case_tac ys) +apply simp +apply(case_tac zs) +apply (simp) +apply(simp add:left_distrib) +done + +lemma iprod_left_diff_distrib: "\xs - ys, zs\ = \xs,zs\ - \ys,zs\" +apply(induct xs arbitrary: ys zs) +apply (simp add: o_def split_def) +apply(case_tac ys) +apply simp +apply(case_tac zs) +apply (simp) +apply(simp add:left_diff_distrib) +done + +lemma iprod_assoc: "\x *\<^sub>s xs, ys\ = x * \xs,ys\" +apply(induct xs arbitrary: ys) +apply simp +apply(case_tac ys) +apply (simp) +apply (simp add:right_distrib mult_assoc) +done + +end \ No newline at end of file