1 / 10

Prolog recap

Prolog, invented in 1970 and efficiently implemented in 1975, is a powerful and fast language for a wide range of applications. Despite being underappreciated, Prolog can be faster than Java and significantly speeds up software production.

anajones
Download Presentation

Prolog recap

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Prolog recap Prolog was invented in 1970, first implemented in 1972, first implemented efficiently in 1975. Excellent commercial-strength implementations have existed since early 1980s. In over 35 years, Prolog has been unmatched as an unusually powerful language for a fairly wide range of applications (including circuit design, language processing, software prototyping and runnable specifications) but it is amazingly underappreciated. People do not even know that Prolog is faster than Java when applied in the right way, and that software production can be an order of magnitude faster in this very high-level programming language.

  2. (a) A prime number N is a number whose set of divisors contains only 1 and N. (b) The set of divisors of a number N is the set of numbers in the range 1 .. N which divide N exactly. An informative example % (a) prime( N ) :- divisorSet( N, [1, N] ). % (b) divisorSet( N, DivSet ) :- setof( K, ( inRange( K, 1, N ), N mod K =:= 0 ), DivSet ). % (b') two cases are possible inRange( K, K, High ) :- K =< High. inRange( K, Low, High ) :- Low < High, Low1 is Low + 1, inRange( K, Low1, High ). Prolog has no conditional statements and no iterations. The only operations allowed in the body of a procedure are other procedure calls—and this is quite sufficient.

  3. Two interpretations ancestor( X, Y ) :- father( X, Y ). ancestor( X, Y ) :- father( X, Z ), ancestor( Z, Y ). Your father is your ancestor, and the father of your ancestor is your ancestor, too. This is an example of the declarative (static, logical) interpretation of Prolog definitions. Queries, however, are used to find answers, not only to confirm truths recorded in the Prolog database. Finding is necessarily dynamic, so we need another interpretation.

  4. Two interpretations The procedural (imperative, control) interpretation of Prolog facts and rules focuses on the process of finding answers: To find an ancestor of Y, find his father; or else, take his father (call him Z) and find Z's ancestor. This is the description of a procedure with two variants, one of which is chosen for execution. The procedure's name is ancestor, and it has two parameters. The body of the second variant consists of two procedure calls: first, father with 2 parameters; next, ancestor with 2 parameters.

  5. Compound objects Compound objects are ordered collections of simpler objects that are in some relationship. Examples: two sides of a rectangle, such as 19 by 24, the time in hours and minutes, such as 19:24. The pair (19, 24) can represent a rectangle or a time, so we name the relationship: rectangle( 19, 24 ) timeOfDay( 19, 24 ) We can also represent the time with seconds: timeOfDay( 19, 24, 37 ) This is a different object, but Prolog manages OK. The name is the same, but the arity is not: timeOfDay/2 (two components), timeOfDay/3 (three components).

  6. Compound objects Example: customer( name( jim, white ), address( street( 17, main ), city( bytown, ontario ) ) ) A compound object is incompletely specified if it contains variables – unknown components. An example: customer( X, address( street( 17, main ), city( bytown, ontario ) ) ) "Any customer who lives at 17 Main, Bytown, Ontario.” customer( name( X, white ), address( street( Y, main ), city( Z, ontario ) ) ) "Any customer by the name of White who lives at Main, any town, Ontario.” A variable may appear more than once. For example, rectangle( X, X ) represents a square.

  7. Lists Lists are processed recursively. length( [], 0 ). length( [ _H | T ], Len ) :- length( T, Len1 ), Len is Len1 + 1. nth( 1, [Hd | _Tl], Hd ). nth( N, [_ | Tl], NthElem ) :- N > 1, N1 is N - 1, nth( N1, Tl, NthElem ). member( Hd, [Hd | _Tl] ). member( Elem, [ _Hd | Tl ] ) :- member( Elem, Tl ).

  8. Lists List processing may be non-deterministic, and procedures may have many uses. append( [], L2, L2 ). append( [E | L1], L2, [E | L3] ) :- append( L1, L2, L3 ). The query tells us which of several operations it is. ?- append( [a], [b, c], LL ). ?- append( [a], X, [a, b, c] ). ?- append( Y, [c], [a, b, c] ). ?- append( F, S, [a, b, c] ). ?- append( F, S, FS ). ?- append([X, 55], [Y], [77, Z, 20]).

  9. Prolog at its most elegant intersect( List1, List2 ) :- member( X, List1 ), member( X, List2 ). ?- intersect( [a, c, e, g], [b, c, d] ). true ?- intersect( [a, c, e, g], [b, d, f] ). fail Two lists intersect if they have a common element.

  10. Last words • Much more: • Advanced control, including the cut. • Customizable term syntax. • Logic grammars. • Dynamic (on-the-fly) modification of Prolog code. • Programming with trees and graphs. • Debugging tools. • Programming in the large (modules). • Graphics and user interface programming. • Object-oriented extensions of Prolog. • Where is Prolog is a language of choice? • Rapid software prototyping. • Deductive databases. • Language design and development. • Constraint programming. • Artificial Intelligence: • Games, Planning, Machine Learning, Natural Language Processing.

More Related