80 likes | 204 Views
Datalog & Resolution in Datalog. 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 Facts:
E N D
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 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