Presentation is loading. Please wait.

Presentation is loading. Please wait.

CS 330 Programming Languages 12 / 02 / 2008 Instructor: Michael Eckmann.

Similar presentations


Presentation on theme: "CS 330 Programming Languages 12 / 02 / 2008 Instructor: Michael Eckmann."— Presentation transcript:

1 CS 330 Programming Languages 12 / 02 / 2008 Instructor: Michael Eckmann

2 Michael Eckmann - Skidmore College - CS 330 - Fall 2008 Today’s Topics Questions / comments? Prolog

3 Michael Eckmann - Skidmore College - CS 330 - Fall 2008 Logical connectors a implies b b implies a a  b a  b  implication a is equivalent to b a  b  equivalence a or b a  b  disjunction a and b a  b  conjunction not a  a  negation MeaningExampleSymbolName

4 Michael Eckmann - Skidmore College - CS 330 - Fall 2008 Logic Languages To use a variable in a proposition we need to preface it with either “for all” or “there exists” These are quantifiers –For all is represented by an upside-down A –There exists is represented by a backwards E Predicate calculus consists of the logical connectors and the two quantifiers above.

5 Michael Eckmann - Skidmore College - CS 330 - Fall 2008 Logic Languages Clausal form: B 1  B 2  …  B n  A 1  A 2  …  A m means if all the As are true, then at least one B is true Antecedent: right side Consequent: left side

6 Michael Eckmann - Skidmore College - CS 330 - Fall 2008 Logic Languages The A's and B's in the clausal form can be variables or constants. When they are variables, the “for all” quantifier is implied. We can use clausal form exclusively because: –All predicate calculus propositions can be algorithmically converted to clausal form. So, we do not lose generality by restriction to this form of propositions.

7 Michael Eckmann - Skidmore College - CS 330 - Fall 2008 Predicate Calc and proving theorems The presence of variables in propositions requires resolution to find values for those variables that allow the matching process to succeed. This is called unification. Instantiation is the temporary assigning of values to variables. During some more complex resolutions, assigning some temporary values might cause the matching process to fail, at which time, backtracking must occur to instantiate a different value to the variable.

8 Michael Eckmann - Skidmore College - CS 330 - Fall 2008 Predicate Calc and proving theorems Horn clauses are a restricted kind of clausal form (used when propositions are used for resolution.)‏ –A single atomic proposition on left side –Or –Empty left side Left side is called the head. If left side is not empty the Horn clause is called a headed Horn clause.

9 Michael Eckmann - Skidmore College - CS 330 - Fall 2008 Prolog Prolog implementations use backward chaining Backward chaining –begin with goal and attempt to find sequence that leads to set of facts in database When goal has more than one subgoal, Prolog uses depth-first search Depth-first search – find a complete proof for the first subgoal before working on others backtrackingFor a goal with multiple subgoals, if fail to show truth of one of subgoals, Prolog uses backtracking Backtracking –reconsider previous subgoal to find an alternative solution

10 Michael Eckmann - Skidmore College - CS 330 - Fall 2008 Prolog An example. “Generate and test.” integer_divide(N1, N2, Result) :- is_integer(Result), Product1 is Result * N2, Product2 is (Result + 1) * N2, Product1 =< N1, Product2 > N1. Note: each evaluation of is_integer(Result) gives an integer from the “database” of integers starting at 0. Recall that Prolog instantiates variables by going through the facts in order from the beginning. Query: integer_divide(7,2,Answer).

11 Michael Eckmann - Skidmore College - CS 330 - Fall 2008 Prolog List Structures are another basic data structure in Prolog besides atomic propositions. A List is a sequence of any number of elements Elements can be atoms, atomic propositions, or other terms (including other lists)‏ [apple, prune, grape, kumquat] [] ( empty list)‏ [X | Y] ( head X and tail Y)‏

12 Michael Eckmann - Skidmore College - CS 330 - Fall 2008 Prolog [X | Y] ( head X and tail Y)‏ Head X is like Scheme's car of a list Tail Y is like Scheme's cdr of a list | can be used to dismantle a list into head and tail in query mode | can be used to construct a list from a head and a tail

13 Michael Eckmann - Skidmore College - CS 330 - Fall 2008 Prolog [X | Y] ( head X and tail Y)‏ –my_list([apple, prune, grape]). –my_list([apricot, peach, pear, lime]). These signify that the lists are new elements of the relation my_list. Just like parent(jane). stated that jane is an element of the relation parent. my_list is not a variable --- it is a relation. Example query: –my_list([ My_head | My_tail ] )‏ –Results in my_head instantiated with apple, and my_tail instantiated with [prune, grape]

14 Michael Eckmann - Skidmore College - CS 330 - Fall 2008 Prolog [X | Y] ( head X and tail Y)‏ –my_list([apple, prune, grape]). –my_list([apricot, peach, pear, lime]). –my_list([ My_head | My_tail ] )‏ If this query was part of a goal and it backtracked, the next value for my_head would be: apricot and the next value for my_tail would be: [peach, pear, lime]

15 Michael Eckmann - Skidmore College - CS 330 - Fall 2008 Prolog [X | Y] ( head X and tail Y)‏ –also used for constructing lists Construction example: –[apricot, peach | [pear, lime]]

16 Michael Eckmann - Skidmore College - CS 330 - Fall 2008 Prolog Append –The first two parameters to append are appended together to produce the result which parameter 3 gets instantiated with. –Note: we will “call” append with only the third parameter being a variable! append([], List, List). append([Head | List_1], List_2, [Head | List_3])‏ :- append (List_1, List_2, List_3). Order matters! The termination step (the headless clause) is first (just like in Scheme.) The recursion step is second. Prolog will try to match the propositions in order because it uses depth-first search. How do we read these propositions?

17 Michael Eckmann - Skidmore College - CS 330 - Fall 2008 Prolog append([], List, List). append([Head | List_1], List_2, [Head | List_3])‏ :- append (List_1, List_2, List_3). So it says, if the first parameter is the empty list, the resulting list (parameter 3) is instantiated to the value of the second parameter. Otherwise, list3 is list1 and list2 appended together if the head of the first parameter is the head of parameter 3 (the result) and the tail of the 3 rd parameter is the tail of the 1 st parameter appended to the second parameter. Or in other words: appending [Head | List_1] to List_2 results in [Head | List_3] only if, List_3 is List_1 appened to List_2. It'll become clearer with an example.

18 Michael Eckmann - Skidmore College - CS 330 - Fall 2008 Prolog Similar to scheme's: (cons (car list1) (append (cdr list1) list2))‏ append([], List, List). append([Head | List_1], List_2, [Head | List_3])‏ :- append (List_1, List_2, List_3). append( [bob, jo], [jake, darcie], Family). Let's trace through on the board how Prolog will instantiate Family. (page 705.)‏

19 Michael Eckmann - Skidmore College - CS 330 - Fall 2008 Prolog Example: member(Element, [Element | _ ] ). member(Element, [ _ | List] ) :- member(Element, List). /* _ is anonymous variable, use when we won't use the variable in the proposition. */ These member propositions state that if first parameter is the head of the second parameter, then member is satisfied. If not, then Element is a member of the List if Element is in the tail of the List.

20 Michael Eckmann - Skidmore College - CS 330 - Fall 2008 Prolog Cut (!) to prevent backtracking (to earlier subgoals before the cut during a resolution.)‏ Recall, that prolog backtracks when a goal (or subgoal) fails. Let's say we have something like this on the right hand side of a proposition: –member(X, Lis), do_something(X, Lis, Y). If member is satisfied and then do_something is attempted and fails, backtracking will occur and cause member to be reattempted. Inside member's implementation, it will pick up where it left off and possibly not find another match. To make sure it doesn't backtrack, we can use the Cut. member(Element, [Element | _ ] ) :- !. member(Element, [ _ | List] ) :- member(Element, List). Now, Prolog cannot backtrack to reevaluate member once Element is found in the list.

21 Michael Eckmann - Skidmore College - CS 330 - Fall 2008 Prolog Cut (!) to prevent backtracking (to earlier subgoals before the cut during a resolution.)‏ In this goal: –x, y, z, !, w, q. Once x y and z are satisfied (w/ possible backtracking) then w is attempted. If w fails, then the whole goal fails (because can't backtrack over the !)‏

22 Michael Eckmann - Skidmore College - CS 330 - Fall 2008 Prolog Negation problem parent(bill, jake). parent(bill, shelly). sibling( X, Y) :- parent(M, X), parent(M, Y). goal sibling(X, Y). results in: X = jake Y = jake Because it goes through the facts first with parent(M, X) and instantiates them to bill and jake. Then parent(M,Y) starts at the beginning of the facts and tries to find a fact with bill as parent. It finds bill and jake again.

23 Michael Eckmann - Skidmore College - CS 330 - Fall 2008 Prolog Negation problem solution parent(bill, jake). parent(bill, shelly). sibling( X, Y) :- parent(M, X), parent(M, Y), X <> Y. goal sibling(X, Y). results in: X = jake Y = shelly Because it goes through the facts first with parent(M, X) and instantiates them to bill and jake. Then parent(M,Y) starts at the beginning of the facts and tries to find a fact with bill as parent. It finds bill and jake again. But then X <> Y becomes jake <> jake which fails, so backtracking occurs to parent(M, Y). Prolog remembers where it left off in the list of parent facts, so it gets the next one (bill, shelly) that's good, so then X <> Y becomes jake <> shelly which is satisfied. Done.

24 Michael Eckmann - Skidmore College - CS 330 - Fall 2008 Prolog Fail Can be used (as a subgoal) to force a goal to fail, thus forcing backtracking. Only makes sense as the last subgoal of a goal (because any subgoals after it would never get tested.)‏


Download ppt "CS 330 Programming Languages 12 / 02 / 2008 Instructor: Michael Eckmann."

Similar presentations


Ads by Google