lecture 7 case studies
play

Lecture 7. Case studies Functional Programming 2018/19 Alejandro - PowerPoint PPT Presentation

Lecture 7. Case studies Functional Programming 2018/19 Alejandro Serrano [ Faculty of Science Information and Computing Sciences] 0 Goals Practice our Haskell skills 1. Propositions Tautology checker Simplifjcation 2. Arithmetic


  1. Lecture 7. Case studies Functional Programming 2018/19 Alejandro Serrano [ Faculty of Science Information and Computing Sciences] 0

  2. Goals Practice our Haskell skills 1. Propositions ▶ Tautology checker ▶ Simplifjcation 2. Arithmetic expressions ▶ Difgerentiation Chapters 8.6 from Hutton’s book [ Faculty of Science Information and Computing Sciences] 1

  3. Propositions [ Faculty of Science Information and Computing Sciences] 2

  4. Defjnition Propositional logic is the simplest branch of logic, which studies the truth of propositional formulae or propositions Propositions P are built up from the following components: ▶ Basic values, ⊤ (true) and ⊥ (false) ▶ Variables, X , Y , … ▶ Negation, ¬ P ▶ Conjunction, P 1 ∧ P 2 ▶ Disjunction, P 1 ∨ P 2 ▶ Implication, P 1 = ⇒ P 2 For example, ( X ∧ Y ) = ⇒ ¬ Y [ Faculty of Science Information and Computing Sciences] 3

  5. Truth value of a proposition Each proposition becomes either true or false given an assignment of truth values to each of its variables Take ( X ∧ Y ) = ⇒ ¬ Y : ▶ { X true, Y false } makes the proposition true ▶ { X true, Y true } makes the proposition false [ Faculty of Science Information and Computing Sciences] 4

  6. Tautologies A proposition is called a tautology if it is true for any assignment of variables [ Faculty of Science Information and Computing Sciences] 5

  7. Tautologies A proposition is called a tautology if it is true for any assignment of variables ▶ X ∨ ¬ X ∨ ¬ Y [ Faculty of Science Information and Computing Sciences] 5

  8. Approach: 1. Design a data type Prop to represent Propositions 2. Write a function tv :: Assignment -> Prop -> Bool computes the truth value of a proposition 3. Collect all possible assignments 4. Write a function taut :: Prop -> Bool which computes if a given proposition is a tautology Problem: Test for Tautologies ▶ Problem: Compute if a proposition is a tautology. [ Faculty of Science Information and Computing Sciences] 6

  9. Problem: Test for Tautologies ▶ Problem: Compute if a proposition is a tautology. ▶ Approach: 1. Design a data type Prop to represent Propositions 2. Write a function tv :: Assignment -> Prop -> Bool computes the truth value of a proposition 3. Collect all possible assignments 4. Write a function taut :: Prop -> Bool which computes if a given proposition is a tautology [ Faculty of Science Information and Computing Sciences] 6

  10. (Var 'X' :/\: Var 'Y') :=>: (Not (Var 'Y')) Prop deriving Show | Prop :=>: Prop | Prop :\/: Prop | Prop :/\: Prop | Not Char | Var data Prop = Basic Bool Step 1: Propositions as a data type We can represent propositions in Haskell The example ( X ∧ Y ) = ⇒ ¬ Y becomes [ Faculty of Science Information and Computing Sciences] 7

  11. type Assigment = Map Char Bool Step 1: Assignments as a data type ▶ How to represent assignments? [ Faculty of Science Information and Computing Sciences] 8

  12. type Assigment = Map Char Bool Step 1: Assignments as a data type ▶ How to represent assignments? [ Faculty of Science Information and Computing Sciences] 8

  13. tv :: Assignment -> Prop -> Bool tv _ (Basic b) = _ tv m (Var v) = _ tv m (Not p) = _ tv m (p1 :\/: p2) = _ tv m (p1 :=>: p2) = _ Step 2: Cooking tv 1. Defjne the type 2. Enumerate the cases tv m (p1 :/\: p2) = _ [ Faculty of Science Information and Computing Sciences] 9

  14. tv m (Var v) tv _ (Basic b) = b = Nothing -> error "Variable unknown!" Just b -> b Step 2: Cooking tv 3. Defjne the simple (base) cases ▶ The truth value of a basic value is itself ▶ For a variable, we look up its value in the map case lookup v m of [ Faculty of Science Information and Computing Sciences] 10

  15. = not (tv m p) tv m (Not p) Step 2: Cooking tv 4. Defjne the other (recursive) cases ▶ We call the function recursively and apply the corresponding Boolean operator tv m (p1 :/\: p2) = tv m p1 && tv m p2 tv m (p1 :\/: p2) = tv m p1 || tv m p2 tv m (p1 :=>: p2) = not (tv m p1) || tv m p2 [ Faculty of Science Information and Computing Sciences] 11

  16. Main idea: a. Obtain all the variables in the formula b. Generate all possible assignments assigns = assigns' . vars assigns :: Prop -> [Assignment] vars :: Prop -> [Char] assigns' :: [Char] -> [Assignment] Step 3: Obtaining Assignments ▶ Find all assignments [ Faculty of Science Information and Computing Sciences] 12

  17. Main idea: a. Obtain all the variables in the formula b. Generate all possible assignments assigns = assigns' . vars assigns :: Prop -> [Assignment] vars :: Prop -> [Char] assigns' :: [Char] -> [Assignment] Step 3: Obtaining Assignments ▶ Find all assignments [ Faculty of Science Information and Computing Sciences] 12

  18. assigns = assigns' . vars vars :: Prop -> [Char] assigns :: Prop -> [Assignment] assigns' :: [Char] -> [Assignment] Step 3: Obtaining Assignments ▶ Find all assignments ▶ Main idea: a. Obtain all the variables in the formula b. Generate all possible assignments [ Faculty of Science Information and Computing Sciences] 12

  19. vars :: Prop -> [Char] assigns :: Prop -> [Assignment] assigns' :: [Char] -> [Assignment] assigns = assigns' . vars Step 3: Obtaining Assignments ▶ Find all assignments ▶ Main idea: a. Obtain all the variables in the formula b. Generate all possible assignments [ Faculty of Science Information and Computing Sciences] 12

  20. vars :: Prop -> [Char] = vars p vars (p1 :\/: p2) = vars p1 ++ vars p2 vars (p1 :/\: p2) = vars p1 ++ vars p2 vars (Basic b) = [] vars (Var v) = [v] vars (Not p) Step 3a: Cooking vars 1. Defjne the type 2. Enumerate the cases 3. Defjne the simple (base) cases ▶ A basic value has no variables, a Var its own 4. Defjne the other (recursive) cases vars (p1 :=>: p2) = vars p1 ++ vars p2 [ Faculty of Science Information and Computing Sciences] 13

  21. > vars ((Var 'X' :/\: Var 'Y') :=>: (Not (Var 'Y'))) "XYY" vars :: Prop -> [Char] where vars' (Basic b) = [] vars' (Var v) = [v] -- as before Step 3a: Cooking vars This is not what we want, each variable should appear once ▶ Remove duplicates using nub from the Prelude vars = nub . vars' vars' ... [ Faculty of Science Information and Computing Sciences] 14

  22. assigns' :: [Char] -> [Assignment] assigns' [] = _ assigns' (v:vs) = _ assigns' [] = [empty] Step 3b: Cooking assigns' 1. Defjne the type 2. Enumerate the cases 3. Defjne the simple (base) cases ▶ Be careful! You have one assignment for zero variables ▶ What happens if we return [] instead? [ Faculty of Science Information and Computing Sciences] 15

  23. assigns' (v:vs) = [ insert v True as | as <- assigns' vs] ++ [ insert v False as | as <- assigns' vs] Step 3b: Cooking assigns' 4. Defjne the other (recursive) cases ▶ We duplicate the assignment for the rest of variables, once with the head assigned true and one with the head assigned false [ Faculty of Science Information and Computing Sciences] 16

  24. Given the ingredients, taut is simple to cook -- Using and :: [Bool] -> Bool taut p = and [tv as p | as <- assigns p] -- Using all :: (a -> Bool) -> [a] -> Bool taut p = all (\as -> tv as p) (assigns p) -- Using all :: (a -> Bool) -> [a] -> Bool -- and flip :: (a -> b -> c) -> (b -> a -> c) taut p = all (flip tv p) (assigns p) Step 4: Checking for Tautologies ▶ We want a function taut :: Prop -> Bool which checks that a given proposition is a tautology [ Faculty of Science Information and Computing Sciences] 17

  25. taut p = and [tv as p | as <- assigns p] -- Using and :: [Bool] -> Bool -- Using all :: (a -> Bool) -> [a] -> Bool taut p = all (\as -> tv as p) (assigns p) -- Using all :: (a -> Bool) -> [a] -> Bool -- and flip :: (a -> b -> c) -> (b -> a -> c) taut p = all (flip tv p) (assigns p) Step 4: Checking for Tautologies ▶ We want a function taut :: Prop -> Bool which checks that a given proposition is a tautology ▶ Given the ingredients, taut is simple to cook [ Faculty of Science Information and Computing Sciences] 17

  26. Simplifjcation A classic result in propositional logic Any proposition can be transformed to an equivalent one which uses only the operators ¬ and ∧ 1. De Morgan law: A ∨ B ≡ ¬ ( ¬ A ∧ ¬ B ) 2. Double negation: ¬ ( ¬ A ) ≡ A 3. Implication truth: A = ⇒ B ≡ ¬ A ∨ B [ Faculty of Science Information and Computing Sciences] 18

  27. simp b@(Basic _) simp :: Prop -> Prop = b simp v@(Var _) = v Cooking simp 1. Defjne the type 2. Enumerate the cases 3. Defjne the simple (base) cases [ Faculty of Science Information and Computing Sciences] 19

  28. simp (p1 :=>: p2) = simp (Not p1 :\/: p2) = case simp p of simp (p1 :\/: p2) = simp (Not (Not p1 :/\: Not p2)) simp (p1 :/\: p2) = simp p1 :/\: simp p2 -> Not q q Not q -> q simp (Not p) Cooking simp 4. Defjne the other (recursive) cases ▶ For negation, we simplify if we detect a double one ▶ For conjunction we rewrite recursively ▶ For disjunction and implication, we simplify an equivalent form with less operators [ Faculty of Science Information and Computing Sciences] 20

  29. Arithmetic expressions [ Faculty of Science Information and Computing Sciences] 21

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend