DOC PREVIEW
Berkeley COMPSCI 164 - Logic Programming

This preview shows page 1-2-23-24 out of 24 pages.

Save
View full document
View full document
Premium Document
Do you want full access? Go Premium and unlock all 24 pages.
Access to all documents
Download any document
Ad free experience
View full document
Premium Document
Do you want full access? Go Premium and unlock all 24 pages.
Access to all documents
Download any document
Ad free experience
View full document
Premium Document
Do you want full access? Go Premium and unlock all 24 pages.
Access to all documents
Download any document
Ad free experience
View full document
Premium Document
Do you want full access? Go Premium and unlock all 24 pages.
Access to all documents
Download any document
Ad free experience
Premium Document
Do you want full access? Go Premium and unlock all 24 pages.
Access to all documents
Download any document
Ad free experience

Unformatted text preview:

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

Berkeley COMPSCI 164 - Logic Programming

Documents in this Course
Lecture 8

Lecture 8

40 pages

Load more
Download Logic Programming
Our administrator received your request to download this document. We will send you the file to your email shortly.
Loading Unlocking...
Login

Join to view Logic Programming and access 3M+ class-specific study document.

or
We will never post anything without your permission.
Don't have an account?
Sign Up

Join to view Logic Programming 2 2 and access 3M+ class-specific study document.

or

By creating an account you agree to our Privacy Policy and Terms Of Use

Already a member?