From: Camil Staps Date: Thu, 26 Feb 2015 17:25:02 +0000 (+0100) Subject: Added sorted list X-Git-Url: https://git.martlubbers.net/?a=commitdiff_plain;h=7c2b6a59cda7801fcf142bd1a7d4627595f8e5bf;p=fp1415.git Added sorted list --- diff --git a/week3/camil/StdSortList.dcl b/week3/camil/StdSortList.dcl new file mode 100644 index 0000000..46bd238 --- /dev/null +++ b/week3/camil/StdSortList.dcl @@ -0,0 +1,18 @@ +definition module StdSortList + +import StdClass + +:: SortList a + +newSortList :: SortList a // lege gesorteerde lijst +memberSort :: a (SortList a) -> Bool | Eq, Ord a // is element van +insertSort :: a (SortList a) -> SortList a | Ord a // voeg element toe +removeFirst :: a (SortList a) -> SortList a | Eq, Ord a // verwijder eerste voorkomen +removeAll :: a (SortList a) -> SortList a | Eq, Ord a // verwijder alle voorkomens +elements :: (SortList a) -> [a] // geef alle elementen +count :: (SortList a) -> Int // aantal elementen + +minimum :: (SortList a) -> a // huidige minimum waarde +maximum :: (SortList a) -> a // huidige maximum waarde + +mergeSortList :: (SortList a) (SortList a) -> SortList a | Eq, Ord a // meng gesorteerde lijsten diff --git a/week3/camil/StdSortList.icl b/week3/camil/StdSortList.icl new file mode 100644 index 0000000..759e915 --- /dev/null +++ b/week3/camil/StdSortList.icl @@ -0,0 +1,60 @@ +implementation module StdSortList + +import StdEnv + +:: SortList a :== [a] + +newSortList :: (SortList a) +newSortList = [] + +memberSort :: a (SortList a) -> Bool | Eq, Ord a // is element van +memberSort _ [] = False +memberSort m l + | hd l == m = True + | hd l > m = False + | otherwise = memberSort m (tl l) + +insertSort :: a (SortList a) -> SortList a | Ord a // voeg element toe +insertSort m l = insertSort` newSortList m l +where + insertSort` :: (SortList a) a (SortList a) -> (SortList a) | Ord a + insertSort` l1 m l2 + | count l2 == 0 = l1 ++ [m] + | minimum l2 >= m = l1 ++ [m] ++ l2 + | otherwise = insertSort` (l1 ++ [hd l2]) m (tl l2) + +removeFirst :: a (SortList a) -> SortList a | Eq, Ord a // verwijder eerste voorkomen +removeFirst m l = removeFirst` newSortList m l +where + removeFirst` :: (SortList a) a (SortList a) -> (SortList a) | Eq, Ord a + removeFirst` l1 m l2 + | count l2 == 0 = l1 + | minimum l2 > m = l1 ++ l2 + | minimum l2 == m = l1 ++ tl l2 + | otherwise = removeFirst` (l1 ++ [hd l2]) m (tl l2) + +removeAll :: a (SortList a) -> SortList a | Eq, Ord a // verwijder alle voorkomens +removeAll m l = removeAll` newSortList m l +where + removeAll` :: (SortList a) a (SortList a) -> (SortList a) | Eq, Ord a + removeAll` l1 m l2 + | count l2 == 0 = l1 + | minimum l2 > m = l1 ++ l2 + | minimum l2 == m = removeAll` l1 m (tl l2) + | otherwise = removeAll` (l1 ++ [hd l2]) m (tl l2) + +elements :: (SortList a) -> [a] // geef alle elementen +elements l = l + +count :: (SortList a) -> Int // aantal elementen +count l = length l + +minimum :: (SortList a) -> a // huidige minimum waarde +minimum l = hd l + +maximum :: (SortList a) -> a // huidige maximum waarde +maximum l = last l + +mergeSortList :: (SortList a) (SortList a) -> SortList a | Eq, Ord a // meng gesorteerde lijsten +mergeSortList l1 [] = l1 +mergeSortList l1 l2 = mergeSortList (insertSort (hd l2) l1) (tl l2) diff --git a/week3/camil/StdSortListTest.icl b/week3/camil/StdSortListTest.icl new file mode 100644 index 0000000..411f7ca --- /dev/null +++ b/week3/camil/StdSortListTest.icl @@ -0,0 +1,107 @@ +module StdSortListTest + +/* Test module StdSortList + Voor werken met Gast: + (*) gebruik Environment 'Gast' + (*) zet Project Options op 'Basic Values Only' en '16M' Maximum Heap Size. +*/ + +import gast +import GenLexOrd +import StdSortList + +Start = testn 10000 + (\n` n2` m -> let n = lst2slst (cast [A,B,C] n` ) + n2 = lst2slst (cast [A,B,C] n2`) + in + leeg_is_leeg /\ + count_matches_elems n /\ + is_sorted_elems n /\ + member_is_member n m /\ + member_na_insert n m /\ + member_na_remove n m /\ + insert_remove_invariant n m /\ + minimum_property n /\ + maximum_property n /\ + merge_additive n n2 /\ + merge_member n n2 m /\ + True + ) + +:: Enum = A | B | C + +derive bimap [] +derive ggen Enum +derive genShow Enum +derive gEq Enum +derive gLexOrd Enum +instance == Enum where (==) x y = gEq{|*|} x y +instance < Enum where (<) x y = gEq{|*|} (gLexOrd{|*|} x y) LT + +// clean should have something like this! +cast :: a a -> a +cast _ x = x + +leeg_is_leeg :: Property +leeg_is_leeg + = name "leeg_is_leeg" + (count newSortList == 0) + +count_matches_elems :: (SortList a) -> Property | Eq, Ord a +count_matches_elems n + = name "count_matches_elems" + (length (elements n) == count n) + +is_sorted_elems :: (SortList a) -> Property | Eq, Ord a +is_sorted_elems n + = name "is_sorted_elems" + (isSorted (elements n)) + where isSorted lst = and [ x<=y \\ x<-lst & y<-tl lst ] + +member_is_member :: (SortList a) a -> Property | Eq, Ord a +member_is_member lst e + = name "member_is_member" + ((isMember e (elements lst)) <==> (memberSort e lst)) + +member_na_insert :: (SortList a) a -> Property | Eq, Ord a +member_na_insert lst e + = name "member_na_insert" + (memberSort e (insertSort e lst)) + +member_na_remove :: (SortList a) a -> Property | Eq, Ord a +member_na_remove lst e + = name "member_na_remove" + (not (memberSort e (removeAll e lst))) + +insert_remove_invariant :: (SortList a) a -> Property | Eq, Ord a +insert_remove_invariant lst e + = name "insert_remove_invariant" + (memberSort e lst <==> memberSort e lst`) + where lst` = removeFirst e (insertSort e lst) + +minimum_property :: (SortList a) -> Property | Eq,Ord a +minimum_property n + = name "minimum_property" + (count n > 0 ==> (memberSort min n /\ all ((<=) min) (elements n))) + where min = minimum n + +maximum_property :: (SortList a) -> Property | Eq,Ord a +maximum_property n + = name "maximum_property" + (count n > 0 ==> (memberSort max n /\ all ((>=) max) (elements n))) + where max = maximum n + +merge_member :: (SortList a) (SortList a) a -> Property | Eq,Ord a +merge_member n m e + = name "merge_member" + (memberSort e nm <==> (memberSort e n \/ memberSort e m)) + where nm = mergeSortList n m + +merge_additive :: (SortList a) (SortList a) -> Property | Eq,Ord a +merge_additive n m + = name "merge_additive" + (count n + count m == count nm) + where nm = mergeSortList n m + +lst2slst :: [a] -> SortList a | Eq,Ord a +lst2slst xs = seq (map insertSort xs) newSortList