Presentation is loading. Please wait.

Presentation is loading. Please wait.

COP4020 Programming Languages Logical programming with Prolog Prof. Xin Yuan.

Similar presentations


Presentation on theme: "COP4020 Programming Languages Logical programming with Prolog Prof. Xin Yuan."— Presentation transcript:

1 COP4020 Programming Languages Logical programming with Prolog Prof. Xin Yuan

2 COP4020 Spring 2014 2 10/12/2015 Topics Logic programming with Prolog

3 COP4020 Spring 2014 3 10/12/2015 Definitions: Prolog Terms Terms are symbolic expressions that are Prolog’s building blocks A Prolog program consists of Horn clauses (axioms) that consist of terms Data structures processed by a Prolog program are terms A term is either  a variable: a name beginning with an upper case letter  a constant: a number or string  an atom: a symbol or a name beginning with a lower case letter  a structure of the form: functor(arg 1, arg 2,..., arg n ) where functor is an atom and arg i are sub-terms  a list (also a structure with a functor) of the form [term 1, term 2, …, term n ] Examples:  X, Y, ABC, and Alice are variables  7, 3.14, and ”hello” are constants  foo, barFly, and + are atoms  bin_tree(foo, bin_tree(bar, glarch)) and +(3,4) are structures

4 COP4020 Spring 2014 4 10/12/2015 Term Manipulation Terms can be analyzed and constructed  Built-in predicates functor and arg, for example: ?- functor(foo(a,b,c), foo, 3). yes ?- functor(bar(a,b,c), F, N). F = bar N = 3 ?- functor(T, bee, 2). T = bee(_G1,_G2) ?- functor(T, bee, 2), arg(1, T, a), arg(2, T, b). T = bee(a,b)  The “univ” operator =.. Break up a term into a list or form a term from a list.  ?- foo(a,b,c) =.. L L = [foo,a,b,c]  ?- T =.. [bee,a,b] T = bee(a,b)

5 COP4020 Spring 2014 5 10/12/2015 Unification and Variable Instantiation Variables are used in clauses: A variable is instantiated to a term as a result of unification, which takes place when goals are matched to head predicates  Goal in query: rainy(C)  Fact: rainy(seattle)  Unification is the result of the goal-fact match: C=seattle Unification is recursive:  An uninstantiated variable unifies with anything, even with other variables which makes them identical (aliases)  An atom unifies with an identical atom  A constant unifies with an identical constant  A structure unifies with another structure if the functor and number of arguments are the same and the arguments unify recursively Once a variable is instantiated to a non-variable term, it cannot be changed: “proofs cannot be tampered with”

6 COP4020 Spring 2014 6 10/12/2015 Examples of Unification The built-in predicate = (A,B) succeeds if and only if A and B can be unified, where the goal = (A,B) may be written as A = B  ?- a = a. yes  ?- a = 5. No  ?- 5 = 5.0. No  ?- a = X. X = a  ?- foo(a,b) = foo(a,b). Yes  ?- foo(a,b) = foo(X,b). X = a  ?- foo(X,b) = Y. Y = foo(X,b)  ?- foo(Z,Z) = foo(a,b). no

7 COP4020 Spring 2014 7 10/12/2015 Prolog Lists A list is of the form: [elt 1,elt 2,..., elt n ] where elt i are terms The special list form [elt 1,elt 2,..., elt n | tail] denotes a list whose tail list is tail Examples  ?- [a,b,c] = [a|T]. T = [b,c]  ?- [a,b,c] = [a,b|T]. T = [c]  ?- [a,b,c] = [a,b,c|T]. T = []

8 COP4020 Spring 2014 8 10/12/2015 List Operations: List Membership List membership definitions: member(X, [X|T]). member(X, [H|T]) :- member(X, T). ?- member(b, [a,b,c]).  Execution: member(b,[a,b,c]) does not match member(X,[X|T])  member(b,[a,b,c]) matches predicate member(X 1,[H 1 |T 1 ]) with X 1 =b, H 1 =a, and T 1 =[b,c]  Sub-goal to prove: member(b, [b,c])  member(b,[b,c]) matches predicate member(X 2,[X 2 |T 2 ]) with X 2 =b and T 2 =[c]  The sub-goal is proven, so member(b,[a,b,c]) is proven (deduced)  Note: variables can be "local" to a clause (like the formal arguments of a function)  Local variables such as X 1 and X 2 are used to indicate a match of a (sub)-goal and a head predicate of a clause

9 COP4020 Spring 2014 9 10/12/2015 Predicates and Relations Predicates are not functions with distinct inputs and outputs Predicates are more general and define relationships between objects (terms)  member(b,[a,b,c]) relates term b to the list that contains b  ?- member(X, [a,b,c]). X = a ; % type ';' to try to find more solutions X = b ; %... try to find more solutions X = c ; %... try to find more solutions no  ?- member(b, [a,Y,c]). Y = b  ?- member(b, L). L = [b|_G255] where L is a list with b as head and _G255 as tail, where _G255 is a new variable

10 COP4020 Spring 2014 10 10/12/2015 Predicates and Relations ?- member(b, L). L = [b|_G545] ; L = [_G544, b|_G548] ; L = [_G544, _G547, b|_G551] ; L = [_G544, _G547, _G550, b|_G554] ; L = [_G544, _G547, _G550, _G553, b|_G557] ; L = [_G544, _G547, _G550, _G553, _G556, b|_G560] ; L = [_G544, _G547, _G550, _G553, _G556, _G559, b|_G563].

11 COP4020 Spring 2014 11 10/12/2015 Example: List Append L3 = L1 || L2. How to write this in Prolog? Predicates do not have return value  Implication? L1, L2, L3 must be arguments to a predicate, the programming will then specify the relation.  Append(L1, L2, L3). Define this recursively  Case 1: when L1 is empty  Case 2: when L1 is not empty  Prolog has not if constructs, how to do two cases?

12 COP4020 Spring 2014 12 10/12/2015 Example: List Append Append(L1, L2, L3). %L3 = L1 || L2 Define this recursively  Case 1: when L1 is empty append([], L2, L2).  Case 2: when L1 is not empty append([H | T], L2, [H | append(T, L2) ]) – of course this is incorrect, append does not have a return value. Solution:  append ([H | T], L2, [H | L]) :- append(T, L2, L). Final solution: append([], A, A). append([H|T], A, [H|L]) :- append(T, A, L).

13 COP4020 Spring 2014 13 10/12/2015 Example: List Append List append predicate definitions: append([], A, A). append([H|T], A, [H|L]) :- append(T, A, L). Prolog append is more power then the append function in other languages ?- append([a,b,c], [d,e], X). X = [a,b,c,d,e] ?- append(Y, [d,e], [a,b,c,d,e]). Y = [a,b,c] ?- append([a,b,c], Z, [a,b,c,d,e]). Z = [d,e] ?- append([a,b],[],[a,b,c]). No ?- append([a,b],[X|Y],[a,b,c]). X = c Y = []

14 Example: take out one element from a list predicate prototype: takeout(Item, SrcL, DstL) Three cases:  SrcL is empty  SrcL is not empty: the first element is Item (take out this item)  SrcL is not empty: the first element is not Item (Keep this item) COP4020 Spring 2014 14 10/12/2015

15 Example: take out one element from a list Example6.pl Item may or may not be in SrcL  Three cases: SrcL is empty:  takeout(Item, [], []). SrcL is not empty: the first element is Item (take out this item)  takeout(Item, [Item | L], L). SrcL is not empty: the first element is not Item (Keep this item)  Takeout(Item, [X | L], [X | L1]) :- takeout(Item, L, L1). Item must be in SrcL? COP4020 Spring 2014 15 10/12/2015

16 Permutation of a list perm(L1, L2). %L2 is a permutation of L1 perm([], []). perm([X|Y], Z) :- perm(Y, W), takeout(X, Z, W). Example7.pl COP4020 Spring 2014 16 10/12/2015

17 Example: sorting Interface: sort(List, Sortedlist).  All variables must start with a capital letter. Naïve_sort (very inefficient sorting) naive_sort(List,Sorted):-perm(List,Sorted),is_sorted(Sorted). How to write is_sorted? COP4020 Spring 2014 17 10/12/2015

18 Example: sorting How to write is_sorted? is_sorted([]). is_sorted([_]). is_sorted([X, Y | L]) :- X < Y, is_sorted([Y|L]). COP4020 Spring 2014 18 10/12/2015


Download ppt "COP4020 Programming Languages Logical programming with Prolog Prof. Xin Yuan."

Similar presentations


Ads by Google