Download presentation
Presentation is loading. Please wait.
Published byMyra Armstrong Modified over 9 years ago
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
Similar presentations
© 2024 SlidePlayer.com. Inc.
All rights reserved.