StdSet werkend
authorMart Lubbers <mart@martlubbers.net>
Tue, 3 Mar 2015 11:09:15 +0000 (12:09 +0100)
committerMart Lubbers <mart@martlubbers.net>
Tue, 3 Mar 2015 11:09:15 +0000 (12:09 +0100)
week3/mart/StdSortList.icl
week4/mart/StdSet.dcl [new file with mode: 0644]
week4/mart/StdSet.icl [new file with mode: 0644]

index 2c8ad3f..db71a36 100644 (file)
@@ -2,42 +2,49 @@ implementation module StdSortList
 \r
 import StdEnv\r
 \r
-::  SortList a = SortList (SortList a, a, SortList a) | Empty\r
+::  SortList a :== ([a], a)\r
 \r
 newSortList :: SortList a\r
-newSortList = Empty\r
+newSortList = ([], abort "Empty list")\r
 \r
 memberSort :: a (SortList a) -> Bool | Eq, Ord a\r
-memberSort x Empty = False\r
-memberSort x (le, el, gr)\r
-| x == e = True\r
-| x < el = memberSort x le\r
-| otherwise = memberSort x gr\r
+memberSort e ([], y) = y\r
+memberSort e ([x:xs], y)\r
+| e == x = True\r
+| e > x = False\r
+| otherwise = memberSort e (xs, y)\r
 \r
 insertSort :: a (SortList a) -> SortList a | Ord a\r
-memberSort x Empty = Sortlist (Empty, x, Empty)\r
-memberSort x (le, el, gr)\r
+insertSort e ([], y) = ([e], e)\r
+insertSort e ([x:xs], y)\r
+| e <= x = ([e:x:xs], y)\r
+| otherwise = ([x:fst result], snd result)\r
+       where result = insertSort e (xs, y)\r
 \r
 removeFirst :: a (SortList a) -> SortList a | Eq, Ord a\r
-removeFirst e ([], _)_ = ([], _)\r
+removeFirst e ([], y) = y\r
+removeFirst e ([e], e) = newSortList\r
+removeFirst e ([x:xs], y)\r
+| e == x = ([xs], y)\r
+removeFirst _ _ = abort ""\r
 \r
-removeAll :: a (SortList a) -> SortList a\r
-removeAll _ _ = Empty\r
+removeAll :: a (SortList a) -> SortList a | Eq, Ord a\r
+removeAll _ _ = abort ""\r
 \r
 elements :: (SortList a) -> [a]\r
-elements _ = []\r
+elements _ = abort ""\r
 \r
 count :: (SortList a) -> Int\r
-count _ = 0\r
+count _ = abort ""\r
 \r
 minimum :: (SortList a) -> a\r
-minimum _ = 0\r
+minimum _ = abort ""\r
 \r
 maximum :: (SortList a) -> a\r
-maximum _ = 0\r
+maximum _ = abort ""\r
 \r
 mergeSortList :: (SortList a) (SortList b) -> (SortList a)\r
-mergeSortList _ _ = Empty\r
+mergeSortList _ _ = abort ""\r
 \r
 Start :: String\r
 Start = newSortList\r
diff --git a/week4/mart/StdSet.dcl b/week4/mart/StdSet.dcl
new file mode 100644 (file)
index 0000000..6cad7f1
--- /dev/null
@@ -0,0 +1,25 @@
+definition module StdSet\r
+\r
+import StdClass\r
+\r
+::     Set a\r
+\r
+toSet                  :: [a]             -> Set a | Eq a\r
+fromSet                        :: (Set a)         -> [a]\r
+\r
+isEmptySet             :: (Set a)         -> Bool\r
+isDisjoint             :: (Set a) (Set a) -> Bool  | Eq a\r
+isSubset               :: (Set a) (Set a) -> Bool  | Eq a\r
+isStrictSubset :: (Set a) (Set a) -> Bool  | Eq a\r
+memberOfSet            :: a       (Set a) -> Bool  | Eq a\r
+union           :: (Set a) (Set a) -> Set a | Eq a\r
+intersection   :: (Set a) (Set a) -> Set a | Eq a\r
+nrOfElements   :: (Set a) -> Int\r
+without                        :: (Set a) (Set a) -> Set a | Eq a\r
+\r
+product                        :: (Set a) (Set b) -> Set (a,b)\r
+\r
+instance zero (Set a)\r
+instance ==   (Set a) | Eq a\r
+\r
+powerSet               :: (Set a)         -> Set (Set a)\r
diff --git a/week4/mart/StdSet.icl b/week4/mart/StdSet.icl
new file mode 100644 (file)
index 0000000..a14e6ba
--- /dev/null
@@ -0,0 +1,56 @@
+implementation module StdSet\r
+\r
+import StdEnv\r
+import StdClass\r
+\r
+::     Set a = Set [a]\r
+\r
+toSet  :: [a]             -> Set a | Eq a\r
+toSet s = Set (removeDup s)\r
+\r
+fromSet        :: (Set a)         -> [a]\r
+fromSet (Set s) = s\r
+\r
+isEmptySet     :: (Set a)         -> Bool\r
+isEmptySet s = isEmpty (fromSet s)\r
+\r
+isDisjoint     :: (Set a) (Set a) -> Bool  | Eq a\r
+isDisjoint s1 s2 = nrOfElements (intersection s1 s2) == 0\r
+\r
+isSubset       :: (Set a) (Set a) -> Bool  | Eq a\r
+isSubset s1 s2 = nrOfElements s1 == nrOfElements (intersection s1 s2)\r
+\r
+isStrictSubset :: (Set a) (Set a) -> Bool  | Eq a\r
+isStrictSubset s1 s2 = isSubset s1 s2 && nrOfElements s1 < nrOfElements s2\r
+\r
+memberOfSet    :: a       (Set a) -> Bool  | Eq a\r
+memberOfSet a (Set []) = False\r
+memberOfSet a (Set [x:xs]) = a == x || memberOfSet a (Set xs)\r
+\r
+union  :: (Set a) (Set a) -> Set a | Eq a\r
+union (Set s1) (Set s2) = toSet (s1 ++ s2)\r
+\r
+intersection   :: (Set a) (Set a) -> Set a | Eq a\r
+intersection (Set s1) s2 = Set [e \\ e <- s1 | memberOfSet e s2]\r
+\r
+nrOfElements   :: (Set a) -> Int\r
+nrOfElements s = length (fromSet s)\r
+\r
+without        :: (Set a) (Set a) -> Set a | Eq a\r
+without (Set s1) s2 = Set [e \\ e <- s1 | not (memberOfSet e s2)]\r
+\r
+product        :: (Set a) (Set b) -> Set (a,b)\r
+product (Set s1) (Set s2) = Set [(e1, e2) \\ e1 <- s1, e2 <- s2]\r
+\r
+instance zero (Set a)\r
+where zero = Set []\r
+\r
+instance == (Set a) | Eq a\r
+where (==) s1 s2 = isSubset s1 s2 && isSubset s2 s1\r
+\r
+powerSet       :: (Set a)         -> Set (Set a)\r
+powerSet (Set a) = Set [(Set x) \\ x <- powerSet2 a]\r
+where\r
+       powerSet2       :: [a] -> [[a]]\r
+       powerSet2 [] = [[]]\r
+       powerSet2 [e:xs] = (powerSet2 xs) ++ [[e:x] \\ x <- powerSet2 xs]\r