CS 152: Programming Language Paradigms
Prof. Tom Austin San José State University
Prolog: Resolution, Unification, & Cuts
References for Prolog
• "Learn Prolog Now", http://www.learnprolognow.org
• SWI-Prolog website (contains manual and tutorials), http://www.swi-prolog.org
• "NLP with Prolog in the IBM Watson System", http://www.cs.nmsu.edu/ALP/2011/03/natural-language-processing-with-prolog-in-the-ibm-watson-system/
Review: Facts
likes(batman, gotham).
likes(batman, justice).
likes(ras_al_ghul, justice). likes(ras_al_ghul, revenge).
Review: Queries & Variables
What do Batman and Ra's al Ghul both like?
?- likes(batman,X), likes(ras_al_ghul,X).
X is a variable
comma is "and"
How does Prolog resolve queries?
Through 2 processes: • Resolution • Unification
Resolution & Unification
• Resolution: The process of matching facts & rules to perform inferencing – infer: derive logical conclusions from the
rules. – If a subgoal matches the head of another
rule, we can replace it with the body of the matching rule.
• Unification: Instantiation of variables via pattern matching
likes(batman, gotham). likes(batman, justice). likes(ras_al_ghul, justice). likes(ras_al_ghul, revenge).
likes(batman, X), likes(ras_al_ghul, X).
Query:
Knowledge Base:
likes(batman, gotham). likes(batman, justice). likes(ras_al_ghul, justice). likes(ras_al_ghul, revenge).
likes(batman, X), likes(ras_al_ghul, X).
Query:
Knowledge Base: Finds match for first sub-query; sets a marker
likes(batman, gotham). likes(batman, justice). likes(ras_al_ghul, justice). likes(ras_al_ghul, revenge).
likes(batman, gotham), likes(ras_al_ghul, gotham).
Query:
Knowledge Base: X is bound to gotham
likes(batman, gotham). likes(batman, justice). likes(ras_al_ghul, justice). likes(ras_al_ghul, revenge).
likes(batman, gotham), likes(ras_al_ghul, gotham).
Query:
Knowledge Base: No match found:
fails and backtracks to marker
likes(batman, gotham). likes(batman, justice). likes(ras_al_ghul, justice). likes(ras_al_ghul, revenge).
likes(batman, X), likes(ras_al_ghul, X).
Query:
Knowledge Base: Finds another match for first
sub-query
likes(batman, gotham). likes(batman, justice). likes(ras_al_ghul, justice). likes(ras_al_ghul, revenge).
likes(batman, justice), likes(ras_al_ghul, justice).
Query:
Knowledge Base: X is bound to justice
likes(batman, gotham). likes(batman, justice). likes(ras_al_ghul, justice). likes(ras_al_ghul, revenge).
likes(batman, justice), likes(ras_al_ghul, justice).
Query:
Knowledge Base: Match found, and the result
is returned
More facts:
villain(joker). villain(penguin). villain(catwoman). villain(scarecrow). kills_people(joker). kills_people(penguin). power(scarecrow, fear). romantic_interest(catwoman). romantic_interest(talia).
Rules
scary(V) :- villain(V),
kills_people(V).
scary(V) :- villain(V), power(V,_).
"Head" of the rule
Queries
Who is scary? (in-class)
Math in Prolog
Arithmetic in Prolog
heists(joker, 97). heists(penguin, 18). heists(catwoman, 31). heists(scarecrow, 42). combined_heists(X, Y, Total) :- heists(X,XN), heists(Y,YN), Total = XN + YN.
?- combined_heists(catwoman,
scarecrow,
T). T = 31+42.
Using "is" operator
combined_heists(X, Y, Total) :- heists(X,XN), heists(Y,YN),
Total is XN + YN. ...
?- combined_heists(catwoman,
scarecrow, T).
T = 73.
The Cut Operator
"Learn Prolog Now" section 10.2
The Cut Operator
Motivation: • Prolog may needlessly backtrack • We wish to stop the backtracking
to optimize our code.
max example (no cuts)
max(X,Y,Y):- X =< Y. max(X,Y,X):- X > Y.
Using max ?- max(2,3,M). M = 3 ; false. ?- max(2,1,M). M = 2 ; false.
Why continue the search?
Two types of cuts (!)
• A green cut – improves performance or memory usage – Does not alter results
• A red cut – controls resolution to prevent future
matches – changes the results – is considered "bad form"
max example (no cuts)
max(X,Y,Y):- X =< Y. max(X,Y,X):- X > Y.
If true, no need to
keep searching
max example, with green cut
max(X,Y,Y):- X =< Y, !. max(X,Y,X):- X > Y.
Red Cut Example
Batman is enemies with all villains, unless the villain is also a romantic interest.
Red Cut Example
enemy(batman, X) :- romantic_interest(X),
!, fail.
enemy(batman, X) :- villain(X).
No backtracking once we make it here.
Red Cut Example
bad_breakup(batman, talia). bad_breakup(batman, poison_ivy). enemy(batman, X) :- romantic_interest(X), !, bad_breakup(batman, X). enemy(batman, X) :- villain(X).
Avoiding red cut
bad_breakup(batman, talia). bad_breakup(batman, poison_ivy).
enemy(batman, X) :- villain(X),
\+ romantic_interest(X). enemy(batman, X) :- villain(X),
bad_breakup(batman,X).
Lab
For the rest of the class, continue with the lab from last class.