80 likes | 213 Vues
This document explores how Datalog and Prolog derive goals through a structured method of resolution. By analyzing facts and rules, we observe the successful and failed paths during query resolution. Specific examples detail the aunt relationship example, demonstrating how different sister and parent facts lead to various outcomes in querying. Key concepts of backtracking within Prolog's mechanisms are covered, showing how to trace the resolution path while preventing infinite recursion. The approach presents both fundamental insights for beginners and practical applications for experienced programmers.
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