summaryrefslogtreecommitdiff
path: root/fp1/week1/mart/MatchStrings.icl
blob: f10df450e88bac988d266c5587f006528d6369e1 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
implementation module MatchStrings

import StdEnv

head :: String -> Char
head "" = abort "Empty String"
head s = s.[0]

tail :: String -> String
tail "" = abort "Empty String"
tail s = s % (1, size s - 1)

is_gelijk :: String String -> Bool
is_gelijk "" "" = True
is_gelijk a b = (size a == size b) && (head a == head b) && is_gelijk (tail a) (tail b)

is_deelstring :: String String -> Bool
is_deelstring _ "" = False
is_deelstring a b = is_begin a b || is_deelstring a (tail b)

is_begin :: String String -> Bool
is_begin "" _ = True
is_begin _ "" = False
is_begin a b = head a == head b && is_begin (tail a) (tail b)

is_deel :: String String -> Bool
is_deel "" _ = True
is_deel _ "" = False
is_deel a b = head a == head b && is_deel (tail a) (tail b) || is_deel a (tail b)

is_match :: String String -> Bool
is_match a b = is_begin_match a b || size b > 0 && is_begin_match a (tail b)

is_begin_match :: String String -> Bool
is_begin_match "" _ = True
is_begin_match a "" = head a == '*' && size a == 1
is_begin_match a b
| head a == '.' || head a == head b = is_begin_match (tail a) (tail b)
| head a == '*' = is_begin_match a (tail b) || is_begin_match (tail a) b
| otherwise = False

//Start= (head pink_floyd, tail pink_floyd)
//Start= is_gelijk     "" " "
//Start= is_deelstring "there"          pink_floyd
//Start= is_deelstring "there"          marillion
//Start= is_deel       "there"          marillion
//Start= is_deel       "she and her"    pink_floyd
//Start= is_deel       radiohead        pink_floyd
//Start= is_match      "*.here*.here*." pink_floyd
//Start= is_match      ".here.here."    pink_floyd

pink_floyd= "Is there anybody in there?"
marillion= "Just for the record"
radiohead= "There there"