Slide 1TodaySoftwareFacts and queriesTerminologyGeneralization (a deduction rule)Instantiation (another deduction rule)RulesDatabase programmingCompound termsMust answer to queries be fully grounded?A simple interpreterListsAm a list? predicateLet’s define the predicate memberListsAn operation on lists:List AppendMore on appendExercise for youAnother exercise: desugar ASTAnd another exerciseSome other cool examples to find in tutorialsReading1Lecture 6Logic Programming introduction to Prolog, facts, rulesRas Bodik Shaon BarmanThibaud HottelierHack Your Language!CS164: Introduction to Programming Languages and Compilers, Spring 2012UC BerkeleyTodayIntroduction to PrologAssigned reading: a Prolog tutorial (link at the end)Today is no-laptop Thursday but you can use laptops to download SWI Prolog and solve excercises during lecture.2SoftwareSoftware: download SWI PrologUsage: ?- [likes]. # loads file likes.plContent of file likes.pl:likes(john,mary).likes(mary,jim).After loading, we can ask query:?- likes(X,mary). #who likes mary?X = john ; # type semicolon to ask “who else?”false. # no one else3Facts and queriesFacts:likes(john,mary).likes(mary,jim).Boolean queries?- likes(john,jim).falseExistential queries?- likes(X,jim).mary4TerminologyGround terms (do not contain variables)father(a,b). # fact (a is father of b)?- father(a,b). # query (is a father of b?)Non-ground terms (contain variables)likes(X,X). # fact: everyone likes himself?- likes(X,mary). # query: who likes mary?Variables in facts are universally quantifiedfor all X, it is true that X likes XVariables in queries are existentially quantifieddoes there exist an X such that X likes mary?5Generalization (a deduction rule)Factsfather(abraham,isaac).Query?- father(abraham,X). # this query is a generalization above factWe answer by finding a substitution {X=isaac}.6Instantiation (another deduction rule)Rather than writing plus(0,1,1). plus(0,2,2). …We writeplus(0,X,X). # 0+x=xplus(X,0,X). # x+0=xQuery?- plus(0,3,3). # this query is instantiation of plus(0,X,X).yesWe answer by finding a substitution {X=3}.7RulesRules define new relationships in terms of existing onesparent(X,Y) :- father(X,Y).parent(X,Y) :- mother(X,Y).grandfather(X,Y) :- parent(X,Z), parent(Z,Y).Load family.pl[family]?- grandfather(X,Y).X = john,Y = jim ;false.8Database programmingA database programming rulebrother(Brother, Sib) :- parent(P, Brother), parent(P, Sib),male(Brother),Brother \= Sib. # same as \=(Brother,Sib)In cs164, we will translate SQL-like queries to Prolog. But Prolog can also express richer (recursive) queries:descendant(Y,X) :- father(X,Y).descendant(Y,X) :- father(X,Z), descendant(Y,Z).9Compound termsCompound term = functors and arguments.Name of functor is an atom (lower case), not a Var.example: cons(a, cons(b, nil))A rule:car(Head, List) :- List = cons(Head,Tail).car(Head, cons(Head,Tail)). # equivalent to the aboveQuery:?- car(Head, cons(a, cons(b, nil)).10Must answer to queries be fully grounded?11Program:eat(thibaud, vegetables).eat(thibaud, Everything).eat(lion, thibaud).Queries:eat(thibaud, X)?A simple interpreterA representation of an abstract syntax treeint(3)plus(int(3),int(2))plus(int(3),minus(int(2),int(3)))An interpretereval(int(X),X).eval(plus(L,R),Res) :- eval(L,Lv), eval(R, Rv), Res is Lv + Rv.eval(minus(L,R),Res) :- # same as plus12ListsLists are just compounds with special, clearer syntax.Cons is denoted with a dot ‘.’.(a,[]) is same as [a|[]] is same as [a].(a,.(b,[])) [a|[b|[[]]] [a,b].(a,X) [a|X] [a|X]13Am a list? predicateLet’s test is a value is a listlist([]).list([X|Xs]) :- list(Xs).Note the common Xs notation for a list of X’s.14Let’s define the predicate memberDesired usage:?- member(b, [a,b,c]).true15Listscar([X|Y],X). cdr([X|Y,Y). cons(X,R,[X|R]). meaning ... The head (car) of [X|Y] is X. The tail (cdr) of [X|Y] is Y. Putting X at the head and Y as the tail constructs (cons) the list [X|R]. From: http://www.csupomona.edu/~jrfisher/www/prolog_tutorial16An operation on lists:The predicate member/2:member(X,[X|R]).member(X,[Y|R]) :- member(X,R).One can read the clauses the following way: X is a member of a list whose first element is X. X is a member of a list whose tail is R if X is a member of R.17List Appendappend([],List,List).append([H|Tail],X,[H|NewTail]) :- append(Tail,X,NewTail).?- append([a,b],[c,d],X).X = [a, b, c, d].?- append([a,b],X,[a,b,c,d]).X = [c, d].Hey, “bidirectional” programming! Variables can act as both inputs and outputs18More on append?- append(Y,X,[a,b,c,d]).Y = [],X = [a, b, c, d] ;Y = [a],X = [b, c, d] ;Y = [a, b],X = [c, d] ;Y = [a, b, c],X = [d] ;Y = [a, b, c, d],X = [] ;false.19Exercise for youCreate an append query with infinitely many answers.?- append(Y,X,Z).Y = [],X = Z ;Y = [_G613],Z = [_G613|X] ;Y = [_G613, _G619],Z = [_G613, _G619|X] ;Y = [_G613, _G619, _G625],Z = [_G613, _G619, _G625|X] ;20Another exercise: desugar ASTWant to rewrite each instance of 2*x with x+x:rewrite(times(int(2),R), plus(Rr,Rr)) :- !, rewrite(R,Rr).rewrite(times(L,int(2)), plus(Lr,Lr)) :- !, rewrite(L,Lr).rewrite(times(L,R),times(Lr,Rr)) :- !, rewrite(L,Lr),rewrite(R,Rr).rewrite(int(X),int(X)).21And another exerciseAnalyze a program:1) Translate a program into facts. 2) Then ask a query which answers whether a program variable is a constant at the of the program.Assume the program contains two statement kindsS ::= S* | def ID = n | if (E) ID = nYou can translate the program by hand22Some other cool examples to find in tutorials compute the derivative of a functionthis is example of symbolic manipulationsolve a math problem by searching for a solution:“Insert +/- signs between 1 2 3 4 5 so that the result is 5.”23ReadingRequireddownload SWI prologgo through a good prolog tutorial, including lists, recursionRecommendedThe Art of Prolog (this is required reading in next
View Full Document