september 19, 2012introduction to artificial intelligence lecture 5: functional programming with...

18
September 19, 2012 Introduction to Artificial Intelligence Lecture 5: 1 Functional Programming Symbolic AI is based on a representation of the world in terms of symbols and rules. Here, the AI comes in the form of algorithms that manipulate the symbols in order to solve problems or derive new knowledge. In order to explore such algorithms and experiment with them, we will use a functional programming language. Functional programming languages are well-suited for implementing complex algorithms in a concise and readable way and offer great flexibility in

Upload: charlene-parker

Post on 12-Jan-2016

217 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: September 19, 2012Introduction to Artificial Intelligence Lecture 5: Functional Programming with Haskell 1 Functional Programming Symbolic AI is based

September 19, 2012 Introduction to Artificial Intelligence Lecture 5: Functional Programming

with Haskell

1

Functional ProgrammingSymbolic AI is based on a representation of the world in terms of symbols and rules.

Here, the AI comes in the form of algorithms that manipulate the symbols in order to solve problems or derive new knowledge.

In order to explore such algorithms and experiment with them, we will use a functional programming language.

Functional programming languages are well-suited for implementing complex algorithms in a concise and readable way and offer great flexibility in modifying, reusing, and testing code.

Page 2: September 19, 2012Introduction to Artificial Intelligence Lecture 5: Functional Programming with Haskell 1 Functional Programming Symbolic AI is based

September 19, 2012 Introduction to Artificial Intelligence Lecture 5: Functional Programming

with Haskell

2

The Haskell LanguageTraditionally, AI researchers and educators used the language LISP.

LISP is a powerful language that is still being used; for example, emacs is programmed in LISP.

However, in my opinion, LISP programs are not very readable or at least require some time to get used to.

Therefore, we will use Haskell, which has a rather straightforward and clear syntax.

It is similar to many other functional languages such as F#, ML, Miranda, or OCaml.

Page 3: September 19, 2012Introduction to Artificial Intelligence Lecture 5: Functional Programming with Haskell 1 Functional Programming Symbolic AI is based

September 19, 2012 Introduction to Artificial Intelligence Lecture 5: Functional Programming

with Haskell

3

The Haskell LanguageYou can download the Haskell Platform and find tons of information about the language here:

http://www.haskell.org

In particular, please study Chapters 1 to 6 of the free online Haskell Tutorial with the beautiful title: “Learn you a Haskell for Great Good!”

http://learnyouahaskell.com/

In the next lecture, we will review the Haskell basics, discuss your questions and look at some more advanced Haskell topics.

Page 4: September 19, 2012Introduction to Artificial Intelligence Lecture 5: Functional Programming with Haskell 1 Functional Programming Symbolic AI is based

September 19, 2012 Introduction to Artificial Intelligence Lecture 5: Functional Programming

with Haskell

4

Today’s Haskell Session in ClassPlease take some time to study Haskell; it’s not only important for this course, but knowing principles of functional programming will also make you a better programmer in imperative languages such as C++ or Java.

The next page shows the Haskell programs we developed in class today, followed by the complete protocol of our Haskell session.

Please e-mail me anytime with any questions you may have.

Page 5: September 19, 2012Introduction to Artificial Intelligence Lecture 5: Functional Programming with Haskell 1 Functional Programming Symbolic AI is based

September 19, 2012 Introduction to Artificial Intelligence Lecture 5: Functional Programming

with Haskell

5

The Programs We Wrote Today

fact 0 = 1

fact n = n*fact (n - 1)

mymap f [] = []

mymap f (x:xs) = (f x):(mymap f xs)

quicksort [] = []

quicksort (x:xs) = (quicksort smaller) ++ [x] ++ (quicksort greater)

where smaller = filter (< x) xs

greater = filter (>= x) xs

Page 6: September 19, 2012Introduction to Artificial Intelligence Lecture 5: Functional Programming with Haskell 1 Functional Programming Symbolic AI is based

September 19, 2012 Introduction to Artificial Intelligence Lecture 5: Functional Programming

with Haskell

6

Today’s Haskell Session (1)*Main> 5

5

it :: Integer

*Main> it

5

it :: Integer

*Main> 5+3

8

it :: Integer

*Main> 5/3

1.6666666666666667

it :: Double

*Main> 2^10

1024

it :: Integer

Page 7: September 19, 2012Introduction to Artificial Intelligence Lecture 5: Functional Programming with Haskell 1 Functional Programming Symbolic AI is based

September 19, 2012 Introduction to Artificial Intelligence Lecture 5: Functional Programming

with Haskell

7

Today’s Haskell Session (2)

*Main> 2^1000000

… a few hours later…

… 888403162747109376

it :: Integer

*Main> 'a'

'a'

it :: Char

*Main> 'b'

'b'

it :: Char

*Main> 3 == 5

False

it :: Bool

Page 8: September 19, 2012Introduction to Artificial Intelligence Lecture 5: Functional Programming with Haskell 1 Functional Programming Symbolic AI is based

September 19, 2012 Introduction to Artificial Intelligence Lecture 5: Functional Programming

with Haskell

8

Today’s Haskell Session (3)*Main> 5 == 5

True

it :: Bool

*Main> let double x = 2*x

double :: Num a => a -> a

*Main> double 4

8

it :: Integer

*Main> double 2.2

4.4

it :: Double

*Main> let mult x y = x*y

mult :: Num a => a -> a -> a

Page 9: September 19, 2012Introduction to Artificial Intelligence Lecture 5: Functional Programming with Haskell 1 Functional Programming Symbolic AI is based

September 19, 2012 Introduction to Artificial Intelligence Lecture 5: Functional Programming

with Haskell

9

Today’s Haskell Session (4)*Main> mult 4 7

28

it :: Integer

*Main> mult 4.4 7.1

31.240000000000002

it :: Double

*Main> let timesthree = mult 3

timesthree :: Integer -> Integer

*Main> timesthree 4

12

it :: Integer

*Main> (5, 3)

(5,3)

it :: (Integer, Integer)

Page 10: September 19, 2012Introduction to Artificial Intelligence Lecture 5: Functional Programming with Haskell 1 Functional Programming Symbolic AI is based

September 19, 2012 Introduction to Artificial Intelligence Lecture 5: Functional Programming

with Haskell

10

Today’s Haskell Session (5)*Main> fst it

5

it :: Integer

*Main> snd (5, 3)

3

it :: Integer

*Main> :t fst

fst :: (a, b) -> a

*Main> []

[]

it :: [a]

*Main> [3]

[3]

it :: [Integer]

Page 11: September 19, 2012Introduction to Artificial Intelligence Lecture 5: Functional Programming with Haskell 1 Functional Programming Symbolic AI is based

September 19, 2012 Introduction to Artificial Intelligence Lecture 5: Functional Programming

with Haskell

11

Today’s Haskell Session (6)*Main> 3:[5]

[3,5]

it :: [Integer]

*Main> [1..10]

[1,2,3,4,5,6,7,8,9,10]

it :: [Integer]

*Main> ['a'..'z']

"abcdefghijklmnopqrstuvwxyz"

it :: [Char]

*Main> even 5

False

it :: Bool

*Main> mod 5 2

1

it :: Integer

Page 12: September 19, 2012Introduction to Artificial Intelligence Lecture 5: Functional Programming with Haskell 1 Functional Programming Symbolic AI is based

September 19, 2012 Introduction to Artificial Intelligence Lecture 5: Functional Programming

with Haskell

12

Today’s Haskell Session (7)*Main> [x | x <- [1..10], even x]

[2,4,6,8,10]

it :: [Integer]

*Main> [(x,y) | x <- [1..3], y <- ['a'..'c']]

[(1,'a'),(1,'b'),(1,'c'),(2,'a'),(2,'b'),(2,'c'),(3,'a'),(3,'b'),(3,'c')]

it :: [(Integer, Char)]

*Main> mult 5 5.5

27.5

it :: Double

*Main> let prime n = n > 1 && [x | x <- [2..(div n 2)], mod n x = 0] == []

<interactive>:77:58: parse error on input `='

*Main> let prime n = n > 1 && [x | x <- [2..(div n 2)], mod n x == 0] == []

prime :: Integral t => t -> Bool

Page 13: September 19, 2012Introduction to Artificial Intelligence Lecture 5: Functional Programming with Haskell 1 Functional Programming Symbolic AI is based

September 19, 2012 Introduction to Artificial Intelligence Lecture 5: Functional Programming

with Haskell

13

Today’s Haskell Session (8)*Main> prime 2

True

it :: Bool

*Main> prime 3

True

it :: Bool

*Main> prime 4

False

it :: Bool

*Main> filter even [1..100]

[2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,96,98,100]

it :: [Integer]

Page 14: September 19, 2012Introduction to Artificial Intelligence Lecture 5: Functional Programming with Haskell 1 Functional Programming Symbolic AI is based

September 19, 2012 Introduction to Artificial Intelligence Lecture 5: Functional Programming

with Haskell

14

Today’s Haskell Session (9)*Main> :t filter

filter :: (a -> Bool) -> [a] -> [a]

*Main> filter prime [1..100]

[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97]

it :: [Integer]

*Main> filter prime [1..10000]

[2,3,5,7,11,13,17,19,23,29,31,37,41,43… and so on and on…

… 9871,9883,9887,9901,9907,9923,9929,9931,9941,9949,9967,9973]

it :: [Integer]

*Main> mult 5 6

30

it :: Integer

*Main> map prime [3, 4, 5]

[True,False,True]

it :: [Bool]

Page 15: September 19, 2012Introduction to Artificial Intelligence Lecture 5: Functional Programming with Haskell 1 Functional Programming Symbolic AI is based

September 19, 2012 Introduction to Artificial Intelligence Lecture 5: Functional Programming

with Haskell

15

Today’s Haskell Session (10)

*Main> :t map

map :: (a -> b) -> [a] -> [b]

*Main> map (mult 3) [1..10]

[3,6,9,12,15,18,21,24,27,30]

it :: [Integer]

*Main> :t (mult 3)

(mult 3) :: Num a => a -> a

*Main> 4 + 7

11

it :: Integer

*Main> + 4 7

<interactive>:92:1: parse error on input `+'

Page 16: September 19, 2012Introduction to Artificial Intelligence Lecture 5: Functional Programming with Haskell 1 Functional Programming Symbolic AI is based

September 19, 2012 Introduction to Artificial Intelligence Lecture 5: Functional Programming

with Haskell

16

Today’s Haskell Session (11)*Main> (+) 4 7

11

it :: Integer

*Main> map (* 3) [1..10]

[3,6,9,12,15,18,21,24,27,30]

it :: [Integer]

*Main> "hello" ++ " world!"

"hello world!"

it :: [Char]

*Main> [1..10] ++ [30..40]

[1,2,3,4,5,6,7,8,9,10,30,31,32,33,34,35,36,37,38,39,40]

it :: [Integer]

*Main> :reload

[1 of 1] Compiling Main ( test.hs, interpreted )

Ok, modules loaded: Main.

Page 17: September 19, 2012Introduction to Artificial Intelligence Lecture 5: Functional Programming with Haskell 1 Functional Programming Symbolic AI is based

September 19, 2012 Introduction to Artificial Intelligence Lecture 5: Functional Programming

with Haskell

17

Today’s Haskell Session (12)*Main> fact 0

1

it :: Integer

*Main> fact 1

1

it :: Integer

*Main> map fact [1..10]

[1,2,6,24,120,720,5040,40320,362880,3628800]

it :: [Integer]

*Main> :reload

[1 of 1] Compiling Main ( test.hs, interpreted )

Ok, modules loaded: Main.

*Main> mymap even [1..100]

[False,True,False,True,False,True,… and so on…, False, True]

it :: [Bool]

Page 18: September 19, 2012Introduction to Artificial Intelligence Lecture 5: Functional Programming with Haskell 1 Functional Programming Symbolic AI is based

September 19, 2012 Introduction to Artificial Intelligence Lecture 5: Functional Programming

with Haskell

18

Today’s Haskell Session (13)

*Main> :reload

[1 of 1] Compiling Main ( test.hs, interpreted )

Ok, modules loaded: Main.

*Main> quicksort "hello world!"

" !dehllloorw"

it :: [Char]

*Main> :t quicksort

quicksort :: Ord a => [a] -> [a]