110 likes | 247 Views
Discussion #20 Resolution in Datalog. Topics. Datalog Prolog Notation Goals success and failure Examples Recursive Rules Termination Infinite recursion We are not trying to do all of Prolog (or even all of Datalog). 236 Datalog Datalog Prolog.
E N D
Topics • Datalog • Prolog • Notation • Goals success and failure • Examples • Recursive Rules • Termination • Infinite recursion • We are not trying to do all of Prolog (or even all of Datalog).
236 Datalog Datalog Prolog • Database oriented (i.e. query answering) • Does not include some features. (Prolog does have the power of procedural languages, but we won't do general I/O, arithmetic, and negation.) • The exact distinction is fuzzy (and doesn't matter). • For the project, we'll do exactly the language we've defined, 236 Datalog. • Syntactically taken from a real Prolog • Is an actual subset of Datalog
236 Datalog Prolog (Differences…) • Constants • Prolog: numbers or alphanumeric beginning with lower case letter • 236 Datalog: only strings • Variables • Prolog: begin with a capital letter (anonymous variables, i.e. _ ) • 236 Datalog: begin with a letter (no anonymous variables) • Predicates • Prolog: begin with lower case letter • 236 Datalog: begin with a letter • Comments • Prolog: % … • 236 Datalog: #-comments and #|…|#-comments • Queries • Prolog: | ?- is the interactive prompt, so | ?- p(Y). is the query • 236 Datalog: not interactive, no prompt, just P(Y)?
236 Datalog Prolog (Similarities…) • Same syntax for Facts and Rules • Comma means • No semicolon for () use 2 rules. parent(x,y) :- mother(x,y); father(x,y). changes to: parent(x,y) :- mother(x,y). parent(x,y) :- father(x,y). • Recursive rules the same • Derivations the same • Instantiation • Unification • Resolution (derivations of empty clause) • Backtracking • Results same: “can be derived from database”
Prolog Derivations Although derivations are the same, there is a different way of looking at the derivation in terms of • Goals query and atomic formulas in the body of the rule. • Success can be derived • Failure cannot be derived We can use this same view in 236 Datalog. We’ll use the following database to explain these ideas. Facts: sister('ann','bob'). parent('bob','jay'). parent('bob','kay'). Rules: aunt(x,y) :- sister(x,z), parent(z,y). Queries: aunt('ann','jay')? aunt('ann',x)?
Prolog Derivations (continued…) Prolog 1. aunt('ann','jay') goal 2. aunt('ann','jay') :- sister('ann',z), parent(z,'jay'). 2a. sister('ann','ann') subgoal 2b. Fail! Backtrack 2a. sister('ann','bob') subgoal 2b. Matches a Fact (directly) 2c. parent('bob','jay') subgoal 2c. Matches a Fact (directly) Success! Yes! Resolution 1. aunt('ann','jay') 2. aunt('ann','jay') :- sister('ann',z), parent(z,'jay'). 2a. sister('ann','ann') 2b. Fail! Backtrack 2a. sister('ann','bob') 2b. res. with fact: sister('ann','bob') 2c. parent('bob','jay') 2c. res. with fact: parent('bob','jay') Yes!
Facts: sister('ann','bob'). parent('bob','jay'). parent('bob','kay'). Rules: aunt(x,y) :- sister(x,z), parent(z,y). Queries: aunt('ann',x)? 236 Datalog aunt('ann',x)? 1. aunt('ann','ann') goal 2. aunt('ann','ann') :- sister('ann',z),parent(z,'ann'). 2a. sister('ann','ann') subgoal Fail! Backtrack 2a. sister('ann','bob') subgoal Succeed! 2b. parent('bob','ann') subgoal Fail! Backtrack 2a. sister('ann','jay') subgoal Fail! Backtrack 2a. sister('ann','kay') subgoal Fail! Backtrack 1. aunt('ann','bob') goal 2. aunt('ann','bob') :- sister('ann',z),parent(z,'bob'). 2a. sister('ann','ann') subgoal Fail! Backtrack 2a. sister('ann','bob') subgoal Succeed! 2b. parent('bob','bob') subgoal Fail! Backtrack 2a. sister('ann','jay') subgoal Fail! Backtrack 2a. sister('ann',‘kay') subgoal Fail! Backtrack
1. aunt('ann','jay') goal 2. aunt('ann','jay') :- sister('ann',z),parent(z,'jay'). 2a. sister('ann','ann') subgoal Fail! Backtrack 2a. sister('ann','bob') subgoal Succeed! 2b. parent('bob','jay') subgoal Succeed! Output “x='jay'” 2a. sister('ann','jay') subgoal Fail! Backtrack 2a. sister('ann','kay') subgoal Fail! Backtrack 1. aunt('ann','kay') goal 2. aunt('ann','kay') :- sister('ann',z),parent(z,'kay'). 2a. sister('ann','ann') subgoal Fail! Backtrack 2a. sister('ann','bob') subgoal Succeed! 2b. parent('bob','kay') subgoal Succeed! Output “x='kay'” 2a. sister('ann','jay') subgoal Fail! Backtrack 2a. sister('ann',‘kay') subgoal Fail! Backtrack Facts: sister('ann','bob'). parent('bob','jay'). parent('bob','kay'). Rules: aunt(x,y) :- sister(x,z), parent(z,y). Queries: aunt('ann',x)?
Facts: sister('ann','bob'). parent('bob','jay'). parent('bob','kay'). Rules: aunt(x,y) :- sister(x,z), parent(z,y). Queries: aunt('ann',x)? Tree View aunt('ann',x) x = 'ann' x = 'bob' x = 'jay' x = 'kay' … … sister('ann',z),parent(z,'ann'). sister('ann',z),parent(z,'jay'). … z = 'ann' z = 'ann' z = 'bob' … sister('ann','ann') sister('ann','ann') fail fail sister('ann','bob'),parent('bob‘,'jay'). Note that we only need to keep track of one path from root to leaf at a time. succeed succeed
rule 4 rule 5 f(1,3) fail f(1,z),b(z,3) z=2 z=3 z=1 f(1,2),b(2,3) succeed f(1,3),b(3,3) fail f(1,1),b(1,3) succeed rule 4 f(2,3) succeed Potential Infinite Recursion b(1,3) Domain = {1,2,3} 1. f(1,1). 2. f(1,2). 3. f(2,3). 4. b(x,y):-f(x,y). 5. b(x,y):-f(x,z),b(z,y). b(1,3)? Infinite recursion! Keep current path stack if recursive call already in path, fail! Infinite Recursion! fail