Download presentation
Presentation is loading. Please wait.
Published byPearl York Modified over 9 years ago
1
28-4-2008P-Phunck - Prolog1 Introduction to Prolog Brian Paden
2
28-4-2008P-Phunck - Prolog2 History Creators: Alain Colmerauer & Phillipe Roussel University of Aix-Marseille 1972 Robert Kowalski University of Edinburgh Named by: Philippe Roussel programmation en logique First compiler: David H. D. Warren
3
28-4-2008P-Phunck - Prolog3 More History 1984 – Began working on standard 1987 – ISO Standard Group Formed 1995 – ISO Standard published Most current New version expected “by early 2000”
4
28-4-2008P-Phunck - Prolog4 Predicate Logic First order predicate calculus Propositions Atomic propositions & compound terms Resolution Inference rule Horn clauses Single atomic proposition on left side Empty left side
5
28-4-2008P-Phunck - Prolog5 Data Types Atom Letters or numbers'x', 'longConstant17', '“Var”' Variable Start with uppercase 'X', 'NotanAtom' Anonymous variable - '_' Fact 'doesntKnow( “Prolog”, brian ).'
6
28-4-2008P-Phunck - Prolog6 Variables Two states Instantiated Variable has a set value Uninstantiated Has not been assigned a value Closed-world assumption Only true if it can be proven
7
28-4-2008P-Phunck - Prolog7 Data Structures Compound term Functor and arguments 'weird( prolog, yes ).' Queries '?- good( presentation, brian )' Only returns 'yes' or 'no' Conjunction Multiply queries and facts
8
28-4-2008P-Phunck - Prolog8 Special Compound Terms List Head First element in list Tail List containing everything else in list except the head Last element is empty list - '[]' '[]', '.' - '[a,[b,[c]]]' == 'a.b.c.[]' String Special list – all elements are atoms '[“This”,is,a,string,in,”Prolog”]'
9
28-4-2008P-Phunck - Prolog9 More Lists Special list operators '[]' - Empty list '[X|Y]' – X is head, Y is tail '””' - convert list to list containing ascii values Recursive search for element of list member(X,[X|_]). member(X,[_|Y]) :- member(X,Y). ?- member(c,[a,b,c,d,e,f]). yes
10
28-4-2008P-Phunck - Prolog10 Built in Operators Compound construction ',' - conjunction, ';' - disjunction Comparison 'X = Y' – equality, 'X \= 2' – inequality 'X == Y' – strict equality, 'X \== 2' – strict inequality 'X < Y', 'X =< Y', - less than, less than equal to 'X > Y', 'X >= Y' – greater than, greater than equal to Arithmetic 'X + Y', 'X - Y', 'X * Y', 'X / Y', 'X mod Y'
11
28-4-2008P-Phunck - Prolog11 Arithmetic Operators that stand out '\' - not, '\=' - not equal '= =' - greater equal Perform arithmetic 'is' ' Y = Y/X' – tests equality 'Y is Y/X' – assigns numeric value to Y Right hand side of 'is' must be algebraic
12
28-4-2008P-Phunck - Prolog12 Looping No iteration, only recursion factorial(0,1). factorial(N,F) :- N>0, N1 is N-1, factorial(N1,F1), F is N * F1. ?- factorial(3,X). X=6
13
28-4-2008P-Phunck - Prolog13 I/O Special file 'user' Output 'tell(X).' - creates/opens file 'telling(X).' - gets open file name 'told' – closes file Input see, seeing, seen Misc 'tab(X)', 'nl'
14
28-4-2008P-Phunck - Prolog14 Backtracking User query Searches database for fact declaring it true Matching fact (head rule) found Mark place in database, move on to next goal No matching fact found Attempt to re-satisfy goal Undo last change and try again Cut Shortcuts backtracking '!' symbol
15
28-4-2008P-Phunck - Prolog15 Backtracking in Action father(mary,george). father(john,george). father(sue,harry). father(george,edward). father(X) :- father(_,X). Database Query ?- father(Y). Result Y=george; Y=harry; Y=edward; no
16
28-4-2008P-Phunck - Prolog16 Lists and Backtracking reverse([],[]). reverse([Head|Tail],List) :- reverse(Tail,Result), append(Result,[Head],List). trace. ?- reverse([a,b,c],Q).
17
28-4-2008P-Phunck - Prolog17 Reverse Example (1) 1 Call: reverse([a,b,c],_6)? (2) 2 Call: reverse([b,c],_65636)? (3) 3 Call: reverse([c],_65646)? (4) 4 Call: reverse([],_65656)? (4) 4 Call: Exit: reverse([],[]) (5) 4 Call: append([],[c],_65646)? (5) 4 Exit: append([],[c],[c]) (3) 3 Exit: reverse([c],[c]) (6) 3 Call: append([c],[b],_65636)? (7) 4 Call: append([],[b],_25)? (7) 4 Exit: append([],[b],[b]) (6) 3 Exit: append([c],[b],[c,b]) (2) 2 Exit: reverse([b,c],[c,b) (8) 2 Call: append([c,b],[a],_6)? (9) 3 Call: append([b],[a],_32)? (10) 4 Call: append([],[a],_39)? (10) 4 Exit: append([],[a],[a]) (9) 3 Exit: append([b],[a],[b,a]) (8) 2 Exit: append([c,b],[a],[c,b,a]) (1) Exit: reverse([a,b,c],[c,b,a])
18
28-4-2008P-Phunck - Prolog18 How to Cut sum_to(1,1) :- !. sum_to(N,Res) :- N1 is N – 1, sum_to(N1,Res), Res is Res + N. Database Query ?- sum_to(5,X). Result X = 15; no
19
28-4-2008P-Phunck - Prolog19 Useful Built in Predicates Conditional 'true', 'fail' – Always their namesakes 'atom(X)', 'integer(X)' – true if X is an atom or int 'atomic(X)' – X is not a variable 'asserta(X)' – adds clause X to start of database 'assertz(X)' – adds clause to end of database 'X =.. L' - Univ X is variable L is list where head is functor and tail is arguments
20
28-4-2008P-Phunck - Prolog20 Example: Binary Tree lookup(H,w(H,G,_,__,G) :- !. lookup(H,w(H1,_,Before,_),G) :- aless(H,H1), lookup(H,Before,G). lookup(H,w(H1,_,_,After),G) :- not(aless(H,H1)), lookup(H,After,G). ?- lookup(key,X,582), lookup(val,X,356). ImplementationUsage
21
28-4-2008P-Phunck - Prolog21 Example: Quicksort partition([], _, [], []). partition([X|Xs], Pivot, Smalls, Bigs) :- ( X @ Smalls = [X|Rest], partition(Xs, Pivot, Rest, Bigs) ; Bigs = [X|Rest], partition(Xs, Pivot, Smalls, Rest) ). quicksort([]) --> []. quicksort([X|Xs]) --> { partition(Xs, X, Smaller, Bigger) }, quicksort(Smaller), [X], quicksort(Bigger).
22
28-4-2008P-Phunck - Prolog22 Example: Turing Machine turing(Tape0, Tape) :- perform(q0, [], Ls, Tape0, Rs), reverse(Ls, Ls1), append(Ls1, Rs, Tape). perform(qf, Ls, Ls, Rs, Rs) :- !. perform(Q0, Ls0, Ls, Rs0, Rs) :- symbol(Rs0, Sym, RsRest), once(rule(Q0, Sym, Q1, NewSym, Action)), action(Action, Ls0, Ls1, [NewSym|RsRest], Rs1), perform(Q1, Ls1, Ls, Rs1, Rs). symbol([], b, []). symbol([Sym|Rs], Sym, Rs). action(left, Ls0, Ls, Rs0, Rs) :- left(Ls0, Ls, Rs0, Rs). action(stay, Ls, Ls, Rs, Rs). action(right, Ls0, [Sym|Ls0], [Sym|Rs], Rs). left([], [], Rs0, [b|Rs0]). left([L|Ls], Ls, Rs, [L|Rs]).
23
28-4-2008P-Phunck - Prolog23 Compilers ISO Compliant GNU Prolog http://www.gprolog.org/ SWI-Prolig http://www.swi-prolog.org/ YAP http://www.ncc.up.pt/yap/ Visual Prolog (Turbo Prolog) http://www.visual-prolog.com/ http://www.visual-prolog.com/
24
28-4-2008P-Phunck - Prolog24 Sources Clocksin, W.F and Mellish, C.S. Programming in Prolog. Berlin. Springer-Verlag: 1984 Sebesta, Robert W. Concepts of Programming Languages: Eighth Edition. 2007 http://en.wikipedia.org/wiki/Prolog
Similar presentations
© 2024 SlidePlayer.com Inc.
All rights reserved.