This document provides an outline and overview of the Logic Programming 2G1121 course. It includes:
- An outline of the course lectures covering topics like theory, simple programs, recursion, search-based programming, logic and grammars, program transformation, and constraint logic programming.
- An introduction to logic programming theory covering topics like data representation in logic programs, logical variables, unification, definite clauses, the model theory and proof theory of logic programs.
- Examples of simple logic programs defining family relationships and using concepts like predicates, facts, rules, logical variables, and recursion.
- A discussion of key concepts in logic programming like the declarative and procedural semantics of programs, and how Prolog works
Copyright:
Attribution Non-Commercial (BY-NC)
Available Formats
Download as PPT, PDF, TXT or read online from Scribd
This document provides an outline and overview of the Logic Programming 2G1121 course. It includes:
- An outline of the course lectures covering topics like theory, simple programs, recursion, search-based programming, logic and grammars, program transformation, and constraint logic programming.
- An introduction to logic programming theory covering topics like data representation in logic programs, logical variables, unification, definite clauses, the model theory and proof theory of logic programs.
- Examples of simple logic programs defining family relationships and using concepts like predicates, facts, rules, logical variables, and recursion.
- A discussion of key concepts in logic programming like the declarative and procedural semantics of programs, and how Prolog works
This document provides an outline and overview of the Logic Programming 2G1121 course. It includes:
- An outline of the course lectures covering topics like theory, simple programs, recursion, search-based programming, logic and grammars, program transformation, and constraint logic programming.
- An introduction to logic programming theory covering topics like data representation in logic programs, logical variables, unification, definite clauses, the model theory and proof theory of logic programs.
- Examples of simple logic programs defining family relationships and using concepts like predicates, facts, rules, logical variables, and recursion.
- A discussion of key concepts in logic programming like the declarative and procedural semantics of programs, and how Prolog works
Copyright:
Attribution Non-Commercial (BY-NC)
Available Formats
Download as PPT, PDF, TXT or read online from Scribd
This document provides an outline and overview of the Logic Programming 2G1121 course. It includes:
- An outline of the course lectures covering topics like theory, simple programs, recursion, search-based programming, logic and grammars, program transformation, and constraint logic programming.
- An introduction to logic programming theory covering topics like data representation in logic programs, logical variables, unification, definite clauses, the model theory and proof theory of logic programs.
- Examples of simple logic programs defining family relationships and using concepts like predicates, facts, rules, logical variables, and recursion.
- A discussion of key concepts in logic programming like the declarative and procedural semantics of programs, and how Prolog works
Copyright:
Attribution Non-Commercial (BY-NC)
Available Formats
Download as PPT, PDF, TXT or read online from Scribd
Download as ppt, pdf, or txt
You are on page 1of 387
The Course
Logic Programming 2G1121
Thomas Sjland sjoland@imit.kth.se Laboratory of Electronic and Computer Systems IMIT, Department of Microelectronics and Information Technology IT-Universitetet KTH, The Royal Institute of Technology
Outline of lectures F1: Theory and Simple Programs, unification 1: Theory and Simple Programs, (cont) F2: Elementary Programs, proof trees and search trees 2: Programming Style, recursion F3: Advanced Recursive Techniques 3: Search Based Programming, cut and negation F4: Search Based Programming, state space, puzzles, games 4: An interpreter for BASIC F5: Logic and Grammars, parsing with DCG F6: Program Transformation F7: Metaprogramming, Expert Systems F8: Constraint Logic Programming 5-6: Project presentation F1: Theory and simple programs Sterling and Shapiro ch. 1,2,4,5,6 Nilsson and Maluszynski ch.1,2,3,6
Theory for Logic Programming Outline Informal introduction to logic programming theory Data in logic programs: Individual constants, term constructors, logical variables, compound terms, trees and lists Equality theory, Unification Logic Programs: Definite (Horn) Clauses Model theory (least Herbrand model, term interpretation) Proof theory and operational semantics of Prolog (SLD-resolution, proof trees) Simple databases Recursive rules Logic Programming Using proofs to compute To each proof you can order a computation To each computation you can order a proof
Representation of knowledge and computations - algorithms - functions - relations Data in Logic Programs Programs express facts about a world of objects Constants functors Numbers Compounded structures (normally finite) Lists Trees Objects in Logic Programs Individual constants a b foo 4711 -37 34.5 Functors structure names of trees and graphs same syntax as non-numerical constants
Arity (number of arguments): term/4, a/0
Syntax example: term(a,b,-4711,other(b,a)) Logical Variables - Syntax Syntax: begin with a capital letter (or '_')
X Y Z Foo _Bar _
Variables can occur wherever constants or structures occur
Range over logical objects
_ is "anonymous" or "void" Programs are Theories sets of relations (predicates) over objects
The classical form of a definition is as a clausal form where a positive literal P has exactly one occurrence:
P or not Q1 or ... or not Qn
This can be written as P if Q1 & ... & ... Qn.
If all goals Qi are true the clause becomes P. Program = Definitions + Query The general form of a relation definition is
P if (Q 11 & ... & Q 1n ) or ...or (Q m1 & ... & Q mn ).
1..m and 1..n are index sets large enough to cover all goal atoms, Q ij
Program = Definitions + Query Elementary literals (atoms) true, false, X=Y cannot be redefined (only used in queries and definition bodies)
Defined literals (p above) Definite Clauses: Facts
Facts: statements of form P :- true. Also written simply as P. Example: brother(nils,karl). Means that the binary relation brother holds between individual constants nils and karl.
Definite Clauses: Rules
Rules: conditional formulae of the form P :- Q1,....,Qn.
P is called the head and Q1,...,Qn the body of the clause and P, Q1,...,Qn are atomic formulas (relation symbols). Some of the Qi may be predefined relation symbols (=, <)
":-" is read as "if", "," is read as "and" Definite Clauses: Rules, example
Example of a rule:
grandfather(X,Y) :- father(X,Z), father(Z,Y). The binary relation grandfather holds between two individuals represented by variables X and Y if the relation father holds between X and some Z and between that Z and Y. Clause Syntax
In english the above example could be stated as follows: - The property p holds for the constant 17. - The property p holds for a term denoted by the variable X if X<8 and q holds for X. - The property p holds for X if q holds for X, X equals a term s(Y) and p holds for Y. Programs are Theories Definitions are collections of facts and rules - sets of relations (predicates) over the objects
e.g. (for predicate p/2 using q/2 and r/2)
p(foo,bar). p(Foo,Bar) :- q(Foo,Baz), r(Baz,Bar).
Functions are special cases of relations (deterministic)
Query, Goal
formula to be verified (or falsified) Questions posed to the system are of the form
?- Q1,...,Qn.
for example ?- q(Foo,Baz), r(Baz,Bar).
If the system succeeds to prove the formula, the values of the variables (the bindings) that are the result are shown, otherwise the proof attempt has failed or possibly loops. Note that more than one solution is possible.
How Prolog works A user query ?- p(Args). is proven using resolution - look for all definition clauses of p - pick one, save others as alternatives - match the arguments in Args with the terms in the head of the clause, create necessary variable bindings - if the matching unification fails, try next alternative - else prove the goal clauses of the body from left to right - if all proofs are done, the bindings are presented Database for family relationships parent(Parent, Child), male(Person) and female(Person)
Logical variables - semantics Variables can occur wherever constants or structures occur. Range over logical objects. Bound to structures and to other variables. The semantics is "single-assignment" - starts "unbound" - once bound, stays the same in the whole proof Example cont.: rules father(Dad, Child):- parent(Dad, Child), male(Dad). mother(Mum, Child):- parent(Mum, Child), female(Mum).
The symbol ';' can be used to avoid defining auxiliary predicates or to reduce the number of clauses. ';' is read as "or". A clause of the form P :- Q1, (Q2 ; Q3), Q4. is the same as P :- Q1, Q, Q4. Q :- Q2. Q :- Q3.
Equality theory - Substitutions
X equals Y iff X is an unbound variable or Y is an unbound variable or X and Y are (bound to) the same constant or X and Y are terms with the same functor and arity e.g. X is term(Z1,..,Zn) and Y is term(U1,...,Un) and for all arguments 1=<i=<n: Zi equals Ui.
Substitutions
A substitution is a function Subst: Var -> Term
Substitutions can be applied to terms or substitutions and also to formulas We may represent a substitution as a conjunction of simple equalities v=t where a variable v occurs on the left hand side at most once or as a set {v/t | v=t} meaning a function that replaces v with t for each v/t in the set Unifier A unifier is a substitution o such that soto
(applying o to s and to t creates identical terms)
Most general unifier
A unifier o is more general than a unifier o iff there exists another unifier e such that o e o
A unifier o is the most general unifier of two terms iff o is more general than any other unifier of the two terms
Most general unifier, example Example : t(X,Y,Z) and t(U,V,W) are unified by {X/a,Y/b,Z/c, U/a,V/b,W/c}
consider for instance the mgus in this case {X/U,Y/V,Z/W} and {U/X,V/Y,W/Z} Unification procedure
An algorithm that constructs most general unifiers for two terms in an environment is a unification procedure. Since the most general unifier is unique (modulo renaming of variables), unification can also be understood as a function unify : Subst x Term x Term -> Subst
1: Theory and simple programs (cont) Operational Semantics, SLD Sterling and Shapiro ch. 1,2,4,5,6 Nilsson and Maluszynski ch.1,2,3,6
Example cont.: structured data Use compound (not atomic) terms for the description of persons. parent(erik, jonas). parent(erik, eva). parent(lena, jonas). male(person(erik,50,180cm)). male(person(jonas,25,_)). father(Dad,Child) :- Dad = person(DadName,_,_), Child=person(ChildName,_,_), parent(DadName, ChildName), male(Dad).
?-father(person(_,50,_), person(X,_,_)). X=jonas (second solution: X = eva) NB: how does the unification algorithm work here? Logical Variables in Programs Variables and parameters are implicitly quantified syntax: variables start with capital letter p(X,Y) :- q(X,Z), r(Z,Y). is understood as forall X,Y:(p(X,Y) <- exists Z:(q(X,Z), r(Z,Y)))
Parameters (X,Y) are often confusingly named "global variables" as opposed to "local variables" (Z)
but if X is global and Y is local, what is Y, if X=Y occurs in program? Example cont.: recursive rules ancestor(Ancestor, Descendant) :- parent(Ancestor, Descendant). ancestor(Ancestor, Descendant) :- parent(Ancestor, Person), ancestor(Person, Descendant).
parent(ulf, erik).
?- ancestor(X, Y). Declarative vs procedural
A logic program can be understood in either of two ways: it can be seen as a set of Horn clauses specifying facts about data (a theory). This is the declarative or model- theoretical reading of a logic program. What? it can be viewed as a program describing a particular execution (how to find a proof). This is the procedural or proof-theoretical reading of a logic program. How? Modus Ponens P Q:-P -------------- Q Proof methods with Horn clauses Given a database: p :- q,r. q :- q1, q2. q1. q2. r.
Proof methods to prove p: Forward chaining - use modus ponens to accumulate known truths, starting from facts. Backward chaining - prove p by proving q and then proving r etc. (used in prolog) Model Theory: Herbrand interpretation
When reading a program as a specification we need to determine the meaning of the symbols. A term interpretation, or "Herbrand interpretation" is an association of a unique function to each functor occurring in the program and an association of sets of tuples of terms to relations. An interpretation is a model for a program if all statements in the interpretation are true. Model Theory: Least Herbrand Model
The least Herbrand model is the least term interpretation such that it is a model. For definite clauses such a unique model always exists.
Least Herbrand Model computed
The model can be inductively built up from the relation symbols and the terms built from constants and terms in the program by constructing a fixpoint. Use the monotone Tp-operator. (N&M p. 29 ch 2.4), ground(P) is the set of all ground instances of clauses in a program P (assume always at least one functor or constant and only finite structures). Tp(I) := {A0 | A0:-A1,...,Am in ground(P) & {A1,...,Am} subset I }. Start from the empty theory and determine the least fixpoint for I=Tp(I) U I.
Note that the model does not contain variables. Constructing a model with Tp p :- q,r. q :- q1, q2. q1. q2. r. s.
The fixpoint is the model: {q1(a,b),q2(b,a),r(a),q(a,b),p(a)} Infinite structures
Assuming that the least Herbrand Model defines the intended meaning of the program, unification must preserve the property that infinite (cyclic) terms are not allowed. This requires an occurs-check in the unification algorithm prohibiting for example X=f(X) from generating X=f(f(f(f(f(f(f(........ This is very inefficient so occurs-check is the responsibility of the programmer. In critical cases a special test must be performed after the unification. Note that SICStus Prolog uses rational trees in X=f(X) Theoretically sound unification: unify_with_occurs_check/2 Proof theory: Execution is search for a proof or failure, generating an or-tree restrictions on the variables are shown as bindings of the variables Search trees and proof trees
Where P is a program, A1,...,Am are atomic formulas (goals), B0 <- B1,...,Bn is a (renamed) clause in P and o=mgu(Ai,B0) Goal and clause selection
A goal selection function specifies which goal Ai is selected by the SLD-rule.
The order in which clauses are chosen is determined with a clause selection rule. Soundness of SLD-resolution
Any query (goal) that is provable with SLD- resolution is a logical consequence of the program. Completeness of SLD-resolution
Any query (goal) that is (true) in the least Herbrand model is provable with SLD- resolution. In the case of an infinite SLD-tree, the selection function has to be fair (as in breadth first search). For finite SLD-trees left-first-with- backtracking as used in Prolog gives a complete method. Conclusion LP can be used as a uniform language for representing databases, e.g. data structure and queries can be written in a single language LP extends traditional databases by having recursive rules and structured data facilities F2: logic programming style Sterling and Shapiro ch. 2,6,7,13 (except 2.4, 2.5, 3.6, 6.3, 7.6, 13.3, 13.4) Nilsson and Maluszynski ch.7 (except 7.3)
Outline Programming techniques Arithmetic in Prolog Different primitives for equality: =/2, ==/2 Recursive definitions Procedural - declarative Imperative - logical style binary trees, lists append/3 reverse/2 quicksort/2
Specifying the use of a procedure For serious projects it is good programming practice to specify the intended use of important procedures, such as the predicates intended to use in a library. For instance this could be given as a comment of the following form:
% procedure foo(T1,T2,...Tn) % % Types: T1: type 1 % T2: type 2 % T3: type 3 % ... % Tn: type n % Relation scheme:... % Modes uf use: (input arguments T1,T2) (output arguments T3,...,Tn) % Multiplicities of solution: deterministic (one solution only) Built-in arithmetics is/2
a built-in predicate for evaluation of arithmetical expressions
?- Value is Expression. - first, Expression is evaluated and, second, unified with Value
For example,
?- X = 2, Y is 1+X*3. - Y = 7 ?- X = 2, 4 is X*X. - yes ?- Z is 1+x. - instantiation error, x is a constant ?- Z is 1+X. - instantiation error, X is not instantiated ?- 2 is 1+X. - instantiation error, X is not instantiated ?- X=1+2. - Yes. X = 1+2.
2: Elementary programs Sterling and Shapiro ch. 1,2,4,5,6 Nilsson and Maluszynski ch.1,2,3,6
Composing recursive programs think about declarative meaning of recursive data type (a definition) write down recursive clause and base clause run simple examples - check different goals check what is happening (do you get the expected result?) Composing recursive programs Typical errors: missing (or erroneously failing) base case error in data structure representation wrong arity of structures mixing an element and a list permuted arguments Natural numbers Unary syntax
For example, 0 - denotes zero s(0) - denotes 1 ... s(s(s(0))) - denotes n Defining the natural numbers
[Head|Tail] cons cell Head is an element, Tail is a list '.'(Head,Tail) [] empty list simpler syntax [a | [] ] = [a] [a | [ b | [] ] ] = [a, b] [erik], [person(erik,_,_),jonas|[lena, eva]]
defining a list
list([]). - defines the basis list([X|Xs]) :- list(Xs). - defines the recursion
NB: for finding a key of a value, the traversal of tree should be implemented. Composing recursive programs Final example Define a predicate unsort_deg(Xs, D) that, given a list of numbers, finds its unsort degree D. The unsort degree of a list is the number of pairs of element positions in the list such that the first position precedes the second in the list, but the number occupying the first position is greater than the number occupying the second position. Some examples: the unsort degree of the list [1, 2, 3, 4] is 0 the unsort degree of the list [2, 1, 4, 3] is 2 the unsort degree of the list [4, 3, 2, 1] is 6
Representing sets Sets can be represented by the existing datatypes in a convenient way by enforcing an order on a structure used to store the set. For instance using an ordered list (or tree) where each element has a unique occurrence and where all operations are assumed to take ordered unique lists as input and produce ordered unique lists. If the sets are allowed to contain uninstantiated elements, however, we may have some problems with enforcing the requirement that the lists are ordered and unique, since the requirement may be violated in a later stage. Consider for instance[X,Y,Z] as a representation of a set with three uninstantiated elements. Of course if X=Y is executed, the list no longer contains unique elements. Perhaps even more obvious is that we cannot ensure that the order of the elements is the one intended until the elements are at least partially known. invariants are the responsibility of the programmer Syntactic support
Using op/3 properties (priority, prefix,infix,postfix, associativity) of operators can be defined and then used. (see manual for details)
Predicates defined by the user are written with the same syntax as structures, for instance
:- op(950, xfy, [in]). foo(Y) :- X in Y, baz(Y in U,Z). F3: Advanced recursive techniques
Sterling and Shapiro ch. 7,8,13.3, 15 Nilsson and Maluszynski ch. 7.3.
Outline Programming with accumulating parameters Programming with difference-structures Queues with difference-structures Abstract data types, separation of data definitions (types) and the program's logic Accumulating parameters reverse lists
a) naive reverse (using append in each recursion step) reverse([], []). reverse([X|Xs], Ys) :- reverse(Xs, Zs), append(Zs, [X], Ys).
Define the predicate for computing the factorial of a given integer.
a) recursion
factorial(0, 1). factorial(N, F) :- N > 0, N1 is N -1, factorial(N1, F1), F is N*F1. Built-in arithmetics Example
Define the predicate for computing the factorial of a given integer.
b) recursion with an accumulator
factorial(N, F) :- factorial(N, F, 1). factorial(0, F, F). factorial(N, F, F1) :- N > 0, N1 is N -1, F2 is N*F1, factorial(N1, F, F2).
Built-in arithmetics Example
Define the predicate for computing the sum of members of integer-list.
a) recursion sumlist([], 0). sumlist([I|Is], Sum) :- sumlist(Is, Sum1), Sum is Sum1 + I.
b) iteration (with accumulator) sumlist(List, Sum) :- sumlist(List, 0, Sum). sumlist([], Sum, Sum). sumlist([I|Is], Sum1, Sum) :- Sum2 is Sum1 + I, sumlist(Is, Sum2, Sum).
Using Abstract Data Types Separation of data definitions (types) and the program's logic.
Specify a set of objects Specify set of operations (relations, functions) on the objects Allow access to objects only through defined operations
Using Abstract Data Types Assume the "data type predicates" specifying operations on a given representation of lists:
cons(H,T,[H|T]). nil([]).
equal(X,X).
Using this method allows change in representation without change in the code of the algorithm. Abstract form of append/3 append(A,B,C) :- nil(A), equal(B,C). append(A,B,C) :- cons(H,T,A), cons(H,R,C), append(T,B,R). Changing Representation Note that the representation of lists can be changed without changing the algorithmic code defining append/3 by replacing these "datatype predicates":
partition(X,[Y|Ys],[Y|Ls],Bs) :- X > Y, partition(X,Ys,Ls,Bs). partition(X,[Y|Ys],Ls,[Y|Bs]) :- X =< Y, partition(X,Ys,Ls,Bs). partition(_,[],[],[]).
Queues A queue may be implemented as a difference list enqueue and dequeue - enqueue(Element, OldQueue, NewQueue) enqueue(X, Qh-[X|Qt], Qh-Qt). - dequeue(Element, OldQueue, NewQueue) dequeue(X,[X|Qh]-Qt, Qh-Qt). Queues (cont)
S=[in(5), in(9), in(10), out(X1), out(X2), in(4)] - an input list for queueing
3: Search based programming Sterling and Shapiro ch. 6,7,11,14,20,21 Nilsson and Maluszynski ch.4,5,11,12, A.3 Outline - Search and control Proof trees Cut Negation, SLDNF Outline Cut execution of a program with cuts insertion of cuts in your own program: "green" and "red" cuts implementation of if-then-else Negation basic concepts execution of programs with negation implementation of negation Controlling search
Sometimes when a solution to a subproblem has been found, no other solutions to it or to earlier proved subgoals of the current goal need to be considered. By using the non-logical primitive predicate !, named 'cut', you remove alternative branches to subgoals and to the clause that is currently being proved. The alternatives on a 'higher' level, that is to the clause which the current goal is a part of are, though, kept. This can decrease the amount of unnecessary computation. Cut syntax !, can be placed in the body of a clause or a goal as one of its atoms to cut branches of an SLD-tree p(X) :- q(X), !, r(X).
effects divides the body into two parts: when "!" is reached, it is evaluated to true and all backtracking of the left-side of the body is disallowed. The execution of the right-side of the clause body continues as usual. new matches of the head of the clause are disallowed e.g. backtracking is stopped one level up in the SLD-tree Cut performs two operations
P :- Q, !, R. P :- ...
removes alternatives to Q that haven't been tried when passing the cut removes alternatives to P that haven't been tried when passing the cut Cut example: execution of a program with cuts
?- top(X,Y). in the given program (seven answers) when true(1) is replaced by ! (five answers) when true(2) is replaced by ! (three answers) Cut inserting cuts in your own program in order to increase efficiency "green" cut: does not change the semantics of a program (cuts away only failing branches in an SLD-tree) "red" cut: changes the semantics of a program (cuts also away success branches in an SLD-tree) in general, is considered harmful Cut "Green cut": an example Given two sorted integer-lists Xs and Ys, construct a sorted integer-list Zs, containg elements from Xs and Ys.
merge([], Ys, Ys). merge(Xs, [], Xs). merge([X|Xs], [Y|Ys], [X|Zs]) :- X < Y, merge(Xs, [Y|Ys], Zs). merge([X|Xs], [Y|Ys], [X, Y|Zs]) :- X = Y, merge(Xs, Ys, Zs). merge([X|Xs], [Y|Ys], [Y|Zs]) :- X > Y, merge([X|Xs], Ys, Zs).
Cut "Green cut": an example (cont.)
merge([], Ys, Ys):- !. merge(Xs, [], Xs):- !. merge([X|Xs], [Y|Ys], [X|Zs]) :- X < Y, !, merge(Xs, [Y|Ys], Zs). merge([X|Xs], [Y|Ys], [X, Y|Zs]) :- X = Y, !, merge(Xs, Ys, Zs). merge([X|Xs], [Y|Ys], [Y|Zs]) :- X > Y, !, merge([X|Xs], Ys, Zs).
Cut "Red cut": an example Find the minimum of two integers.
Try: minimum(X, Y, X) :- X =< Y, !. minimum(X, Y, Y).
?- minimum(4,5,Z). - Yes, Z = 4. ?- minimum(5,4,Z). - Yes, Z = 4. ?- minimum(4,5,5). - Yes.
Correction: minimum(X, Y, Z) :- X =< Y, !, Z=X. minimum(X, Y, Y).
Cut "Red cut": an example Checking membership in a list.
?- member(a, [b,c,a,d]). - checks membership, OK ?- member(X, [b,c,a,d]). - takes elements from a list, takes only the first element ?- member(b, Z). - generates lists containing b generates only one list
OBS: Check the example lookup/3 from the previous lecture!
Cut implementation of if-then-else
P :- Condition, !, TruePart. P :- ElsePart.
or
(Condition -> TruePart; ElsePart)
For example,
minimum(X, Y, Z) :- (X =< Y -> Z = X; Z = Y). Negation: how to use and prove negative information?
A negated query 'not_p(x)' should succeed if the proof of the statement 'p(x)' fails and it should fail if the proof of the statement 'p(x)' succeeds.
%not_p(++) (++ stands for a ground term) not_p(X) :- p(X), !, false. not_p(_).
Closed world assumption That which is not stated explicitly is false
Negation how to use and prove negative information? to apply closed world assumption (cwa): the statement \+ A is derivable if A is a formula which cannot be derived by SLD-resolution. - Problem with infinite SLD-trees implementation: negation as failure (naf): the statement \+ A is derivable if the goal A has a finitely failed SLD-tree. The problem when A has variables remains. unmarried_student(X) :- \+ married(X), student(X). student(erik). married(jonas). Negation SLDNF-resolution the combination of SLD-resolution to resolve positive literals and negation as failure to resolve negative literals
foundation(X) :- on(Y, X), on_ground(X). on_ground(X) :- \+ off_ground(X). off_ground(X) :- on(X, Y). above(X, Y) :- on(X, Y). above(X, Y) :- on(X, Z), above(Z, Y). on(c, b). on(b, a). Negation Four kinds of SLDNF-derivations: refutations (that end with success branches); infinite derivations; (finitely) failed derivations; stuck derivations (if none of the previous apply).
NB: check examples in N&M, pp. 71-73. Negation implementation of \+
\+ Goal :- call(Goal), !, fail. \+ Goal.
example
p(a).
?- p(X). Yes, X = a. ?- \+ \+ p(X). true, X is not instantiated F4: Search based programming Sterling and Shapiro ch. 6,7,11,14,20,21 Nilsson and Maluszynski ch.4,5,11,12, A.3 Outline- Search based programming State space programming generate-and-test searching in a state-space Graph theoretical examples Euler paths, Hamilton paths Puzzle-solving, game-playing
Sterling and Shapiro ch. 14,20 Nilsson and Maluszynski ch. 11
Generate-and-test A technique in algorithm design, which defines two processes the first generates the set of candidate solutions the second tests the candidates In PROLOG: find(X):- generate(X), test(X). Important optimisation: to "push" the tester inside the generator as "deep" as possible Generate-and-test important optimisation: to "push" the tester inside the generator as "deep" as possible
find(X):- generate1(X), test1(X), generate2(X), test2(X), generate3(X), test3(X), generate4(X), test4(X). Generate-and-test Example 1 Finding parts of speech in a sentence:
Place N queens on a NxN chess-board in such a way that any two queens are not attacking each other.
a) Naive generate and test places N queens and then test whether they are not attacking each other. The answer is a list of queens' positions, for example [3, 1, 4, 2].
queens(N, Qs) :- range(1, N, Ns), % Ns is the list of integers in 1..N permutation(Ns, Qs), % Qs is a permutation of Ns safe(Qs). % true, if the placement Qs is safe
range(M, N, [M|Ns]) :- M < N, M1 is M +1, range(M1, N, Ns). range(N, N, [N]). Generate-and-test Example 2 (cont.) permutation(Xs, [Z|Zs]) :- select(Z, Xs, Ys), permutation(Ys, Zs). permutation([], []).
select/3, attack/2 are the same as in a). Searching in a State-space - loop-avoidance in searching for a path - efficiency issues - different search strategies Searching in a State-space Many problems in computer science can be formulated as follows:
Given some start-state S0 and a set of goal-states determine whether there exists a sequence S0 ---> S1, S1 ---> S2, , S(n-1) ---> Sn, such that Sn belongs to a set of goals.
States can be seen as nodes in a graph whose edges represent the pairs in the transition-relation, then the problem reduces to that of finding a path from the start- state to one of the goal-states.
Searching in a state-space Finding a path
path(X,X). path(X,Z) :- edge(X,Y), path(Y,Z).
edge(X,Y) :- % define construction/finding of the next node
member(X, [X|Y]) :- !. member(X, [Y|Z]) :- member(X, Z). Searching in a state-space Puzzle: Missionaries and cannibals Three missionaries and three cannibals must cross a river, but the only available boat will hold only two people at a time. There is no bridge, the river cannot be swum, and the boat cannot cross the river without someone in it. The cannibals will eat any missionaries they outnumber on either bank of the river. The problem is to get everyone across the river with all the missionaries uneaten.
Searching in a state-space Example (cont.) edge( state(M0, C0, L0), move( M, C, D), state (M1, C1, L1) ):- member(M, [0, 1, 2]), member(C, [0, 1, 2]), M + C >= 1, M + C =< 2, M0 >= M, C0 >= C, M1 is 3 - (M0 - M), C1 is 3 - (C0 - C), ( M1 =:= 0 ; M1 =:= 3; M1 = := C1), (L0 = left -> ( D = leftRight, L1 = right); ( D = rightLeft, L1 = left) ).
Searching in a state-space Better representation simpler algorithm Store the whole graph as one fact
graph([edge(a,b),edge(c,d),edge(b,c)]).
path(X, Y, Path) :- graph(G), path(X, Y, Path, G, []). path(X, X, [X], G, G). path(X, Z, Path, G0, G1):- deleteedge(X, Y, G0, Gt), path(Y, Z, [Y|Path], Gt,G1). deleteedge(X, Y, [edge(X,Y)|T], T) :- !. deleteedge(X, Y, [A|T], [A|R]) :- deleteedge(X, Y, T, R). Searching in a state-space Basic search methods depth-first - interprets current nodes as a stack breadth-first - interprets current nodes as a queue bounded-depth - "controls" the depth of the search iterative-deepening -"controls" the depth of the search heuristic methods using domain specific knowledge
Searching in a state-space Heuristic search to solve larger problem, some domain-specific knowledge must be added to improve search efficiency the term heuristic is used for any advice that is often effective, but isn't guaranteed to work in every case a heuristic evaluation function estimates the cost of a shortest path between a pair of states
Many search strategies Bottom-up - inductively generate facts from known facts Top-down - recursively find supporting rules for query Serial - alternatives one at a time, backtrack for more Or- parallel - to prove A or B try A and B in parallel collect all solutions or choose one (first found, best etc.) Concurrent - to prove A & B try A and B concurrently AND-parallel - to prove A & B where A and B have nothing in common do A and B in parallel, then combine results and go on Iterative deepening search all solutions down to a maximum depth, then increase max Tabled execution keep ongoing calls in a table to avoid redundant work Parallelism and Concurrency Concurrent logic programming models Parallel execution on multiprocessors Sterling and Shapiro ch. 14.2 Nilsson and Maluszynski ch.12,14, A.3
Concurrent Logic Programming essense goals in the body of a clause can execute as interleaving processes p(X) :- q(X), r(X). Synchronisation on variable unification "X? = Y" means "X must not be bound by unification"
effects
divides the body into two parts and switches execution between the goals. deadlock is possible Parallel logic programming Computation can be distributed over several computers possibly sharing memory.
OR-parallelism copying of backtrack stack sharing of binding environment
AND-parallelism independent AND (CIAO-Prolog) stream-and ("Penny", parallel AKL) Game playing Game trees a game tree is an explicit representation of all possible plays of the game. The root node is the initial position of the game, its successors are the positions which the first layer can reach in one move, their successors are the positions resulting from the second player's replies and so on. the trees representing the games contain two types of node: max at even levels from the root, and min nodes at odd levels of the root. a search procedure combines an evaluation function, a depth-first search and the minimax backing-up procedure.
Game playing 4 4 2 4 8 2 7 5 4 8 5 2 7 5 3 Maximise Maximise Minimise 4: An interpreter for BASIC
Interpreter as transition relation An interpreter can be formulated as a transition relation p/2 from states to new states
S0 ---> S1 ---> S2 ---> ... ---> Sn-1 ---> Sn
p(S0,S1), p(S1,S2), p(Sn-1, Sn)
Assignment as predicate For instance X:=E would be modeled as a predicate assign(X,E,StateIn,StateOut) :- ...
imperative program state transition relation in a procedure in an imperative language proc {Prog Z := X X := Y Y := Z }
Program as transition relation prog(In,Out) :- assign(Z,X,In,T1), assign(X,Y,T1,T2), assign(Y,Z,T2,Out).
Using grammar notation The state transformation could be expressed using the grammar notation prog --> assign(z,x), assign(x,y), assign(y,z).
Transition relations declaratively State transition predicates are expressed in a perfectly declarative way They still look very similar to the usage of assignment in an imperative language It expresses the change of a thread of state objects logically
Interpreter for the BASIC language member(X,L) :- delete(X,L,_).
get_element(X,L,R) :- delete(X,L,R), !. get_element(Name,L,L) :- write(undefined(Name)). Interpreter for the BASIC language % All elements of a list are equal init(I,[]). init(I,[I|T]) :- init(I,T).
Interpreter for the BASIC language /* Change value of Arg1 in List Arg2 producing Arg3 with Arg4 */
ainsert(int(1),[_|T],[Val|T],Val). ainsert(int(I),[X|T],[X|Rest],Val) :- I>1, I1 is I-1, ainsert(int(I1),T,Rest,Val). ainsert(int(I),_,_,_) :- I<1, abort. Interpreter for the BASIC language
/* Evaluate Arg1 to Arg2 in Environment Arg3 */
realorint(N,I) :- (N=real(I) ; N=int(I)).
operate('+',int(I1),int(I2),R) :- !, E is I1 + I2, R=int(E). operate('-',int(I1),int(I2),R) :- !, E is I1 - I2, R=int(E). operate('*',int(I1),int(I2),R) :- !, E is I1 * I2, R=int(E). operate('/',int(I1),int(I2),R) :- !, E is I1 / I2, R=real(E). operate('+',N1, N2, R) :- realorint(N1,I1), realorint(N2,I2), !, E is I1 + I2, R=real(E). operate('-',N1,N2,R) :- realorint(N1,I1), realorint(N2,I2), !, E is I1 - I2, R=real(E). operate('*',N1,N2,R) :- realorint(N1,I1), realorint(N2,I2), !, E is I1 * I2, R=real(E). operate('/',N1,N2,R) :- realorint(N1,I1), realorint(N2,I2), !, E is I1 / I2, R=real(E). operate('+',string(S),X,R) :- name(S,L), operate('+',L,X,R). operate('+',X,string(S),R) :- name(S,L), operate('+',X,L,R). operate('+',L1,L2,L) :- append(L1,L2,L). Interpreter for the BASIC language and(true,true,V) :- !, V=true. and(X,Y,false).
Interpreter for the BASIC language do_if(C,A,B) :- C, !, A. do_if(C,A,B) :- B.
basic(File) :- abolish(program/2), write('## compiling ##'(File)), nl, readbasic(File,B), flatten(B,Bf), pre(Bf,P0), expand_for(P0,P1), flatten(P1,P), assert(program(File,P)), !, write('### run ###'(File)), nl, basinterp(P,0). Interpreter for the BASIC language basinterp(Prog) :- basinterp(Prog,Prog,[],DataUt,[stop]), nl, write('##### Dataout from basic program: ##'), nl, write(DataUt),nl. Interpreter for the BASIC language basinterp([label(Lbl)|Rest],Prog,DataIn,DataUt,Cont) :- !, do_if(showlabel, (write(label(Lbl)), nl), true), insert(var(pc,Lbl),DataIn,Data0), !, basinterp(Rest,Prog,Data0,DataUt,Cont).
Interpreter for the BASIC language basinterp([goto(Lbl)|_],Prog,Di,Do,Cont) :- !, append(_,[label(Lbl)|Stmts],Prog), !, basinterp([label(Lbl)|Stmts],Prog,Di,Do,Cont).
basinterp([gosub(Lbl)|R],Prog,Di,Do,Cont) :- !, append(_,[label(Lbl)|Stmts],Prog), !, basinterp([label(Lbl)|Stmts],Prog,Di,Do,[R|Cont]). Interpreter for the BASIC language basinterp([on_goto(E,S)|R],Prog,Di,Do,Cont) :- !, eval(E,V,Di), index(V,S,I), !, basinterp([goto(I)|R],Prog,Di,Do,Cont).
basinterp([on_gosub(E,S)|R],Prog,Di,Do,Cont) :- !, eval(E,V,Di), index(V,S,I), !, basinterp([gosub(I)|R],Prog,Di,Do,Cont). Interpreter for the BASIC language basinterp([if(Cond,True,False)|R],Prog,Di,Do,Cont) :- !, eval(Cond,Cval,Di), (Cval=true, append(True,R,Body) ; Cval=false, append(False,R,Body) ), !, basinterp(Body,Prog,Di,Do,Cont). Interpreter for the BASIC language basinterp([for(I,From,To,Step,Body)|R],Prog,Di,Do,Cont) :- !,append(Body, [for(I,expr('+',I,Step),To,Step,Body)], Dobody), !, basinterp([assgn(I,From), if(cond('<=',I,To),Dobody,[none]) |R], Prog, Di, Do, Cont).
Interpreter for the BASIC language basinterp([none|R],Prog,Di,Do,Cont) :- !, basinterp(R,Prog,Di,Do,Cont).
basinterp([stop|_],_,D,D,_) :- !. Interpreter for the BASIC language basinterp([dim([])|R],Prog,Di,Do,Cont) :- !, basinterp(R,Prog,Di,Do,Cont). basinterp([dim([func(Nm,[Len])|T])|R],Prog,Di,Do,Cont) :- !, ilength(Len,Array), init(nil,Array), !, basinterp([dim(T)|R], Prog, [array(Nm,Array)|Di], Do, Cont). Interpreter for the BASIC language basinterp([data(L)|R],Prog,Di,Do,Cont) :- !, get_element(data(D),Di,Dt), append(D,L,DL), !, basinterp(R,Prog,[data(DL)|Dt],Do,Cont).
Interpreter for the BASIC language basinterp([read([])|R],Prog,Di,Do,Cont) :- !, basinterp(R,Prog,Di,Do,Cont). basinterp([read([H|T])|R],Prog,Di,Do,Cont) :- atom(H), !, get_element(data([Element|Data]),Di,Dt), insert(var(H,Element),Dt,Ds), !, basinterp([read(T)|R],Prog,Ds,Do,Cont). basinterp([read([func(X,[I])|T])|R],Prog,Di,Do,Cont) :- !, atom(X), eval(I,Index,Di), delete(data([Yval|Data]),Di,Ds), delete(array(X,Array),Ds,Dt), ainsert(Index,Array,Aout,Yval), !, basinterp( [read(T)|R], Prog, [data(Data),array(X,Aout)|Dt], Do, Cont). Interpreter for the BASIC language basinterp([assgn(X,Y)|R],Prog,Di,Do,Cont) :- atom(X), !, eval(Y,Yval,Di), insert(var(X,Yval),Di,Dt), !, basinterp(R,Prog,Dt,Do,Cont).
basinterp([assgn(func(X,[I]),Y)|R],Prog,Di,Do,Cont) :- !, atom(X), eval(Y,Yval,Di), eval(I,Index,Di), delete(array(X,Array),Di,Dt), ainsert(Index,Array,Aout,Yval), !, basinterp(R,Prog,[array(X,Aout)|Dt],Do,Cont). Interpreter for the BASIC language basinterp([print([])|R],Prog,Di,Do,Cont) :- !, basinterp(R,Prog,Di,Do,Cont).
basinterp([print([H|T])|R],Prog,Di,Do,Cont) :- !, eval(H,V,Di), writeus(V), !, basinterp([print(T)|R],Prog,Di,Do,Cont). Interpreter for the BASIC language basinterp(X,Prog,Di,Do,Cont) :- write('### Not implemented. ###'(X)),nl, Di=Do. F5: Logic and grammars
Sterling and Shapiro ch. 19 (except 19.2),24 Nilsson and Maluszynski ch.10 SICStus Prolog Manual. Outline grammars context free grammars context dependent grammars Context Free Grammars A context free grammar is a 4-tuple < N, T, P, S > where N and T are finite, disjoint sets of nonterminal and terminal symbols respectively, (N U T)* denotes the set of all strings (sequences) of terminals and non-terminals P is a finite subset of N x (N U T)* , S is a nonterminal symbol called the start symbol. Empty string is denoted by c and elements of P are usually written in the form of production rules: A ::= B1, , Bn (n > 0) A ::= c (n = 0) Grammars Example 1
pronoun(singular, [it|X]-X). pronoun(plural, [they|X]-X). Recognizers for languages: Lexers and parsers A program that recognizes a string in a formal language is often divided into two distinct parts: Lexer: translation from lists of character codes to lists of 'tokens' Parser: the translation from lists of 'tokens' to parse trees Concrete syntax (describes a string in a language, a list of tokens) <A> ::= <B>< C> [foo,bar] Abstract syntax (describes a syntax tree, a term) <A> :: <B>< C> A(B, C) Logical Input
A recognizer for s-expressions An s-expression is a general representation form for data used in LISP and in some Prolog dialects, especially those embedded in a LISP or SCHEME environment. We will show how a program identifying s-expressions looks in Prolog.
A non-blank is a character with a character code greater than 32 (decimal). A blank is a character with a character code less than or equal to 32. The input to the parser is represented as a list of characters (or character codes). A recognizer for the s-expression grammar The predicate sExpr(L1,L2,S) succeeds if the beginning of the list L1 is a list of characters representing an s-expression. As a result of the computation the structure S contains a structure (a list) representing the s-expression. The rest of the input text is stored in the list L2. p :- sExpr("(A.B)",Out,S), write(Out), write(S).
Definite clause grammars Parsing Translating grammars into logic programs
Sterling and Shapiro ch. 19 (except 19.2) Nilsson and Maluszynski ch 10.4,10.5 SICStus Prolog Manual Definite Clause Grammars (DCGs) special syntax for language specifications. The system automatically compiles DCG into a Prolog clause. DCGs are a generalisation of CFGs.
Definite Clause Grammars Formalism <N, T, P> N - a possibly infinite set of atoms (non-terminals) T - a possibly infinite set or terms (terminals) P is in N x (N U T)* - a finite set of production rules N and T are disjoint
Definite Clause Grammars Syntax terminals are enclosed by list-brackets; nonterminals are written as ordinary compound terms or constants; ',' separates terminals and nonterminals in the right-hand side; '-->' separates terminals and nonterminals in the right- hand side; extra conditions, in the form of Prolog procedure calls, may be included in the right-hand side of a grammar rule. Such procedure calls are written enclosed in '{ }' brackets; the empty string is denoted by the empty list []
?- sentence(X,[]). Yes X=[the, rabbit, runs], A=[] X=[the, engine, runs], A=[] WHY? see the next page.
Definite Clause Grammars Compilation of DCG's into Prolog p(A1, , An) --> T1, .., Tm is translated into the clause: p(A1, , An, X0, Xm) :- T1', , Tm',
where each Ti' is of the form: q(S1,Sn, Xi-1, Xi) if Ti is of the form q(S1, , Sn) 'C'(Xi-1, X, Xi) if Ti is of the form [X] T, Xi-1 = Xi if Ti is of the form {T} Xi-1 = Xi if Ti is of the form []
and X1,Xm are distinct variables
Definite Clause Grammars Example translated to: expr(X) --> expr(X, X0, X4) :- term(Y), term(Y, X0, X1), [+], 'C'(X1, +, X2), expr(Z), expr(Z, X2, X3), {X is Y + Z}. X is Y+Z, X3 = X4.
readbasic(File,B) :- char_infile(File,0,L), !, lex(Tokens,L,[]), !, basic(B,Tokens,[]). parser for the BASIC language The lexer has produced a list of "tokens". The parser now has to identify the valid language constructs.
stmt(assgn(Var,Expr)) --> expr(Var), [oper('=')], expr(Expr). F6: Program Transformation Sterling and Shapiro ch. 13,16,18
Outline Transformations of programs fold/unfold - partial evaluation Higher order programming defining and using apply, map Transformation rules for programs Since logic programs are defined as axioms, it is often possible to define logically based transformation rules, usable to improve programs. Here are some examples of such rules: Equality reordering
P :- e1qe2 -------------------------- P :- e1,e2q
Motivation: In a (pure) logic program the search will be made more efficient if information about equalities is known as soon as possible to the search procedure. Equality removal
P :- ,e1,,e1,,e1, -------------------------------- P :- ,e1, Motivation: In a (pure) logic program statements about equalities need not be repeated. Unification is idempotent, that is the bindings of variables achived by applying a unification Term1 = Term2 will not be extended by a second application of the same unification. Clause level transformation A clause (j) is a specialized version of a clause (i)
if (Pi :- Q1,,Qm) o = Pj :- Q1',,Qm' in a program: . . (i) Pi :- Q1,,Qm . . (j) Pj :- Q1',,Qm' . . When clause (j) is a specialized version of clause (i) it is redundant (in a pure logic program). But: specialization can increase efficiency and also make an otherwise looping program terminate. That is it might be advantageous to generate different versions for different forms of the arguments and then apply other transformations to the resulting clauses. Removal of failing clauses Suppose that (Pi :- Q1,,Qm) o = Pj :- false This specialized clause may be removed, since it can never contribute to a solution. Moreover, clauses Ck containing a goal that only matches the head Pj can be converted into Ck :- false and the process can be repeated. Removal of repeated goals
P :- ,Qn,,Qn, ------------------------- P :- ,Qn, Motivation: The reasoning concerning equalities above holds for goals in general in a pure logic program. Note that we consider programs equivalent with respect to the Herbrand model. The set of solutions found in proofs may not coincide exactly after such a transformation, but the set of true consequences of a program indicated by the model do coincide given an appropriate interpretation of the free variables in the proofs. Reordering of goals
P :- ,Qi,,Qk, -------------------------- P :- ,Qk,,Qi, Motivation: This rule can for instance be used to push recursive calls towards the end of a clause. Fold/Unfold
P :- Q. | P :- (B1 ; B2). Q :- B1. | Q :- B2. |
-----------> (unfolding) <---------- (folding)
Applying the rules above in combination with rules like those given earlier can create more efficient programs (note that variables must be renamed and the introduction of explicit equalities might be necessary to keep the semantics of P).
Partial deduction/evaluation Partial deduction - logical semantics is kept Partial evaluation - operational semantics is kept (same number of solutions, presented in the same order) Partial evaluation is much harder than partial deduction since it should work even in the presence of non-logical goals such as cut (!), I/O etc. Stepwise enhancement identify program skeletons that indicate the control flow. enhance by adding operations (S&S chap 13)
list([X|Xs]) :- list(Xs). list([]).
sumlist([X|Xs],S) :- sumlist(Xs,S0), S is S0+X. sumlist([],0).
Stepwise enhancement (cont) length([_|Xs],L) :- length(Xs,L0), L is L0+1. length([],0).
sum_length_list([X|Xs],S,L) :- sum_length_list(Xs,S0,L0), S is S0+X, L is L0+1. sum_length_list([],0,0). Functions
Functions are deterministic relations. There is one unique value in the output domain for each input tuple. A function f: Term* -> Term can for instance be encoded as a definition in a logic program as f(X1,,Xn,Y) with a unique output Y for each input tuple X1,,Xn. The relation f/n corresponding to a function with n-1 arguments is deterministic, that is, when all arguments (except possibly the one corresponding to the output value of the function) are fully instantiated. Higher order
Higher order functions are not directly expressible since functions are not objects in the first-order logical model of a program. We will see later how such programming techniques can be encoded using metaprogramming techniques. Higher order programming:apply general form
apply(foo,X1...Xn) :- foo(X1...Xn). mapping a predicate Predname(In,Out) to each element of a list
map_list([X|Xs],Predname,[Y|Ys]) :- apply(Predname,X,Y), map_list(Xs,Predname,Ys). map_list([],_,[]). Higher order programming: map All-solutions predicates It might be useful to collect several solutions in a list. Prolog gives support for this through some "higher-order" predicates.
gives Fathers=[sven,sven,bengt,bengt] All-solutions predicates (cont) Instead of a single solution collecting all fathers to some child we might want a separate solution for each child. There is another set precidate for this.
?- bagof(F, father(F,Kid),Fathers). Kid=lisa Fathers=[sven,bengt] Kid=sven Fathers=[bengt] Kid=olle Fathers=[sven] All-solutions predicates (cont) It is often sensible to present sorted lists of unique solutions. This is achieved by setof.
?- setof(F, father(F,Kid),Fathers). Kid=lisa Fathers=[bengt,sven] Kid=sven Fathers=[bengt] Kid=olle Fathers=[sven] F7: Metaprogramming, Expert Systems Sterling and Shapiro ch. 10,17 (not 17.5),19.2,22 Nilsson and Maluszynski ch. 8,9 Outline - Metaprogramming What is a metastatement? Metalogic predicates (built in) solve, augmenting solve Iterative deepening Mixing object and metalevel programming Support for dynamically changing knowledge bases
What is a metastatement? A metastatement is a statement about statements Stockholm is a nine-letter word. 'X+1-Y' has the size five. 'X+1-Y' contains two variables. This statement is true. This statement is false. 'P :- Q1...Qn.' is a clause. This is a metastatement. Meta-logic Metalogic refers to reasoning about a formalization of some (other) logical system. If the metalogic deals with itself it is called circular or metacircular. In logic programming metalogic has two meanings: 1.using logical inference rules expressed as axioms with a meta-interpreter. 2.expressing properties of the proof procedure. For the latter case the term "meta-logical predicate" is used, for instance in the SICStus manual. Ground representation of facts and rules The logical approach to metaprogramming requires a clear division between object level and meta-level. Formulas are represented as ground facts, where in particular variables on the object level are represented as constants on the meta-level Each constant of the object language is represented by a unique constant of the meta-language Each variable of the object language is represented by a unique constant of the meta-language Each n-ary functor of the object language is represented by a unique n-ary functor of the meta-language Each n-ary predicate symbol of the object language is represented by a unique n- ary functor of the meta-language Each connective of the object language is represented by a unique functor of the meta-language (with corresponding arity) Ground representation clause(if(list(x),equals(x,[]))). clause(if(list(x),and(equals(x,cons(x,h,t)),list(t)))).
<- A1,..,A(i-1),Ai,A(i+1),...,Am B0 <- B1,...,Bn ---------------------------------------------------------- <- (A1,...,A(i-1),B1,...,Bn,A(i+1),...,Am)o The SLD-rule encoded as a relation step(Goal,NewGoal) :- select(Goal,Left,Selected,Right), clause(C), rename(C,Goal,Head,Body), unify(Head,Selected,Mgu), combine(Left,Body,Right,TmpGoal), apply(Mgu,TmpGoal,NewGoal). The SLD-rule encoded as a relation (cont) select/4 describes the relation between a goal and the selected subgoals clause/1 describes the property of being a clause in the object language rename/4 describes the relation between four formulas such that two are uniquely renamed variants of the other two unify/3 describes the relation between two atoms and their mgu combine/4 describes the relation between a goal and three conjunctions apply/3 describes the relation between a substitution and two goals The SLD-rule encoded as a relation (cont) derivation(G,G). derivation(G0,G2) :- step(G0,G1), derivation(G1,G2). Why self-interpreters? flexibility alternative search strategies debugging programs that change during their execution collecting the actual proof of a satisfied goal (explanation) non-standard logics: fuzzy logic, non-monotonic logic, modal logic program transformation, program verification, program synthesis Non-ground representation Efficiency of the previous representation is low -> Use object language variables for meta-level also
Seems straightforward, but mixing object level and meta-level has important semantic consequences.
Consider this representation. (with 'if' and 'and' as infix operators):
for facts: ax(Fact if true). for rules: ax(Head if Body). Metainterpreter for pure Prolog using the above representation
solve(true). solve(P) :- ax(P if Q), solve(Q). solve(P and Q) :- solve(P), solve(Q).
In order to extend the meta-interpreter to handle also non-logical features of Prolog a different interpreter must be written. For instance ! (cut) is hard to handle. Metainterpreter generating a proof Augmented metainterpreter
solve(true,true). solve(P,if(P,ax(P if Q),Qt)) :- ax(P if Q), solve(Q,Qt). solve(P and Q,and(Pt,Qt)) :- solve(P,Pt), solve(Q,Qt).
This metainterpreter generates a proof . Depth-bounded pure Prolog An augmented meta-interpreter for depth-bounded search pure Prolog
solve(true,N) :- N>=0. solve(P,N) :- N>0, ax(P if Q), N1 is N-1, solve(Q,N1). solve(P and Q,N) :- solve(P,N), solve(Q,N).
This meta-interpreter finds a proof with a search tree depth of at most N levels.
depth(0). depth(N) :- depth(N1), N is N1+1.
solve(G) :- depth(N), solve(G,N).
solve/1 tries at gradually deeper levels of the tree, iterative deepening. Meta-logic built-in predicates that perform operations that require reasoning about: the current instantiation of terms; decomposing terms into their constituents.
Instantiation checking:
var(X) - checks that X is uninstantiated variable (not a structure) nonvar(X) - opposite to var/1. ground(X) - checks that X is completely instantiated
Define the predicate plus/3 which uses built-in arithmetics and performs plus and minus.
plus(X, Y, Z):- nonvar(X), nonvar(Y), Z is X+Y. plus(X, Y, Z):- nonvar(X), nonvar(Z), Y is Z-X. plus(X, Y, Z):- nonvar(Y), nonvar(Z), X is Z-Y.
Meta-logic Type checking:
integer(X) - X is instantiated to an integer float(X) - X is instantiated to a float number(X) - X is instantiated to a number atom(X) - X is instantiated to an atom (non-variable term of arity 0, other than a number) atomic(X) - X is instantiated atom or number simple(X) - X is uninstantiated or instantiated to an atom or number compound(X) - X is instantiated to a term of arity > 0, i.e. a list or a structure
?- arg(3, father(X, Y), Z). - No. Meta-logic, decomposing terms Term =.. List (=.. is called univ) List is a list whose head is the atom corresponding to the principal functor of Term, and whose tail is a list of the arguments of Term.
subterm(N, S, T) :- N > 1, N1 is N-1, subterm(N1, S, T). subterm(N, S, T) :- N > 0, arg(N, T, Arg), subterm(S, Arg). Meta-logic Define the predicate subterm(Sub,Term) for checking if Sub is subterm of Term
args(_, [], N, N). args(T, [Arg|Args], I, N) :- I < N, I1 is I+1, arg(I1, T, Arg), args(T, Args, I1, N). Meta-logic define =.. using functor/3 and arg/3
b) List [F|Args] is given T =.. [F|Args] :- length(Args, N), functor(T, F, N), args(Args, T, 1).
args([], _, _). args([Arg|Args], T, N) :- arg(N, T, Arg), N1 is N+1, args(Args, T, N1). Support for dynamic knowledge bases
assert(Clause) - Clause is added to the program clause(Head, Body) - clause with head Head and body Body retract(Clause) - Clause is erased from the program
?- clause(member(H1, H2), B). H1=X, H2=[X|Ys], B= true; H1=X, H2=[Y|Ys], B=member(X,Ys). Expert systems Expert System = Knowledge-base (KB) + Inference engine (IE) + User Interface (UI)
Expert System Shell = (IE) + (UI) Expert systems: Production rules knowledge base often consist of a set of production rules of the form
IF A1 AND(OR) A2 . THEN C1 AND C2
Expert systems: forward/backward chaining forward-chaining: start from assumptions (axioms) and find conclusions backward-chaining: start from conclusions (hypothesis) and look for supporting assumptions Expert systems in Prolog in PROLOG knowledge base = set of clauses inference engine = SLD-resolution
SLD-resolution is a backward chaining proof procedure Uncertainty Expert systems might contain rules and/or facts which hold with some degree of uncertainty
IF it is summer and there are no clouds THEN the temperature is above 20 degrees C CERTAINTY 80% Expert systems, forward/backward Example
Develop an expert system, which finds a name of a fruit when some fruit characteristics such as shape, diameter, surface , colour and the number of seeds are given. Gonzalez: "The engineering of knowledge-based systems." (p91).
Rule 1: IF Shape=long and Colour=green or yellow THEN Fruit=banana fruit(Name, Shape, Diameter, Surface, Colour, FruitClass, SeedCount, SeedClass):- Shape == long, (Colour == green; Colour == yellow), Name = banana.
Rule 2: IF Shape=round or oblong and Diameter > 4 inches THEN FruitClass=vine fruit(Name, Shape, Diameter, Surface, Colour, FruitClass, SeedCount, SeedClass):- var(FruitClass), (Shape == round; Shape ==oblong), integer(Diameter), Diameter>4, FruitClass= vine, fruit(Name, Shape, Diameter, Surface, Colour, FruitClass, SeedCount, SeedClass).
Rule 11: IF FruitClass=tree and Colour=red and SeedClass=stonefruit THEN Fruit=cherry fruit(Name, Shape, Diameter, Surface, Colour, FruitClass, SeedCount, SeedClass):- FruitClass == tree, Colour == red, SeedClass == stonefruit, Name = cherry.
?- fruit(Name, round, 3, Surface, red, FruitClass, 1, SeedClass). Yes. Name = cherry. User interface - dialogue An expert system is often not automatic => user interaction guides the search
graphical user interface dialogue Explanation facilities Expert systems should be able to explain its conclusions to different people (experts, programmers, users)
- How did you come to your conclusion?
- Why does A follow from B ? Knowledge acquisition An expert system should allow incremental updates of the knowledge base and rule base
knowledge can be aquired through dialogue with an expert, or through analysis of the system Rule base as Prolog clauses IF A1 AND (A2 OR A3) THEN C1 AND C2
C1 :- A1, (A2 ; A3). C2 :- A1, (A2 ; A3). Taxonomy of a car-engine car fuel system ignition electric system fuel pump starting motor spark plugs fuel battery fuse needs(car,fuel_system). ....needs(electric_system,fuse). Expert System: diagnosis IF Y is a necessary component for X and Y is malfunctioning THEN X is also malfunctioning
IF X exhibits a fault-symptom Z THEN either X is malfunctioning or there exists another malfunctioning component which is necessary for X Expert system: diagnosis X has an indirect fault if there exists a component which is necessary for X and which malfunctions
malfunctions(X) :- needs(X,Y), malfunctions(Y). malfunctions(X) :- symptom(Y,X), not indirect(X).
indirect(X) :- needs(X,Y), malfunctions(Y).
Expert systems: abduction The knowledge base is usually incomplete
symptoms are not known, but need to be established by asking questions in a dialogue
KB + cause |- symptom
Finding cause is named abduction
self-interpreter generating a proof solve(true,true). solve(P,proof(P,Qt)) :- kb(P if Q), solve(Q,Qt). solve(P and Q,and(Pt,Qt)) :- solve(P,Pt), solve(Q,Qt).
This meta-interpreter generates a proof . query-the-user solve(true). solve(P and Q) :- solve(P), solve(Q). solve(symptom(X,Y)) :- confirm(X,Y). solve(P) :- kb(P if Q), solve(Q).
confirm(X,Y) :- write('Is the '), write(Y), tab(1),write(X), write('? '), read(yes). knowledge base
kb(malfunctions(X) if possible_fault(Y,X) and symptom(Y,X)). kb(possible_fault(flat,tyre) if true).
:- solve(malfunctions(X)).
Is the tyre flat? >yes X=tyre
(anything but 'yes' as answer makes the query fail) F8: Constraint Logic Programming SICStus Prolog Manual Nilsson and Maluszynski ch.14 Course compendium
This lecture is based on slides from Per Kreuger SICS and Christian Schulte IMIT Significance Constraint programming identified as a strategic direction in computer science research
[ACM Computing Surveys, December 1996] This Talk concerned with constraints for
solving combinatorial problems
designed as basic tutorial
Other Areas Programming languages [Oz,Mozart] data structures control mechanism Data bases User interfaces Program analysis Type checking
Application Areas Timetabling Scheduling Crew rostering Resource allocation Workflow planning and optimization Gate allocation at airports Sports-event scheduling Railroad: track allocation, train allocation, schedules Automatic composition of music Genome sequencing Frequency allocation
Techniques Artificial intelligence
Operations research
Algorithms
Programming languages Overview Basics modeling: variables and constraints solving: propagation, distribution, search Solving realistic problems: scheduling modeling solving Constraint programming research systems Case studies instruction scheduling for compiler bus scheduling for real-time system Conclusion Constraint Programming (CP) based on the idea of an abstract space of statements or conditions, a
constraint space
xe{4,5} ye{4,5} x>y y>3 Constraint Programming (CP) Some such statements can be regarded as completely determined:
E.g. A given train trip will leave from Avesta 15.05 on Thursday, October 10th 2002.
Constraint Programming (CP) Other statements are less exact with respect to e.g. the resources some task will need:
E.g. OVAKO Steel needs to transport between 320 and 280 kilotons of steel from Hofors and Hellefors to Malm next year.
Constraint Programming (CP) Such statements can be represented as constraints in a constraint programming system.
These constitute conditions on the values that variables may take (i.e. a form of type).
Constraint Programming (CP) It is nontrivial to determine e.g. how the two above mentioned propositions would be related in some model of a planning problem.
Sometimes it is possible to determine some form of consistency of such propositions.
Constraint Programming (CP) Enumeration It is also possible (in principle) to compute one or more witnesses (a consistent assignment of values to all the variables) of such a system of conditions.
This is called to enumerate the constraint space and generally involves search. Constraint Programming (CP) If more than one witness is computed they can be compared with respect to various cost measures. To determine the (in some sense) best assignment is modeled as an optimization problem in the constraint system. Constraint propagation
Much of the search in the enumeration of a constraint space for a given problem can generally be eliminated by a technique called constraint propagation. x in {2,,5} & y in {3,,9} 2x+3=y x in {2,3} & y in {7,,9} 2x+3=y & y<9 x<3 x=2 y=7 Constraint propagation
Much of the search in the enumeration of a constraint space for a given problem can generally be eliminated by a technique called constraint propagation.
Each (non primitive constraint) can be regarded as a temporarily suspended computation (of the values of the involved variables) that can be made to interact with other such suspended/reinvoked computations. Constraint propagation Computations are suspended when information needed to determine a value is missing but is rescheduled as soon as that information becomes available. One can view the constraint programming system as a pool of concurrent processes that communicate, interact and synchronize through shared variables.
Constraint propagation Propagation is normally not sufficient to completely determine the values of the involved variables. To achieve this we need to combine propagation with enumeration in such a way that values chosen during search trigger further propagation which in turn guides the continued search, etc. Constraint Modelling (CP) The computational complexity of the task to find a solution to a given problem depends to a large extent on the expressive power of the language used to formalize the problem.
To formulate a mathematical model of some real process is generally difficult. It requires a thorough understanding of both the problem domain and the methods employed to solve the problem. Constraint Programming (CP) To some extent this is still more of a craft than a science.
A large body of typical problems with standard models have been identified.
Early attempts to develop a methodology has started to give results.
Finite Domains The constraint programming systems that have been most actively developed the last ten years are those that built on finite domains. In such a system each variable can take on values from a finite set of discrete values. This type of variable is natural to use to model discrete entities such as the number of engines or staff that have been allocated to a given task.
Continuous Domains Finite domain constraints are, however, unnecessarily restrictive when the modeling concerns values that can be assumed to vary over continuous domains (with an infinite number of possible values), for instance time. Comparison with Operations Research ---OR Techniques from Operations Research, e.g. linear programming (LP) and integer programming (IP) efficiently handles models where: 1. Most of the variables are continuous. 2. The model can be relatively directly expressed as a set of simple (linear) equations and inequalities. 3. A simple (linear) and well defined cost function captures well the goodness of different solutions to a given problem. Comparison with Operations Research (2) The techniques that have been developed in constraint programming, using finite domains, work well also when: 1. A majority of the variables model naturally discrete entities. 2. The cost function is hard to determine. 3. The model contains complicated (for instance non-linear) conditions. In this way these two classes of techniques can be said to complement each other.
Global constraints The first type of constraint that was studied in constraint programming was constraints that limits one or relate two variables, e.g. constraints like: < > =< >= = /= Global constraints In contrast to these simple binary constraints the focus has in recent years more and more been on complex constraints between an unlimited number of variables. E.g. constraints: - relating variables with the value of a linear sum - maintaining pairwise disequality of an arbitrarily large set of variables - implementing various scheduling, matching, packing and/or placement mechanisms
Global constraints (2) The expression global constraints for this type of constraints was introduced in {BC94} and refers to arguments that can be made over a multitude of variables related with a non-binary condition. Global constraints (2) Global constraints can in principle often be encoded in terms of a set of simpler binary constraints which semantically have the same meaning. This is rarely practical, however, since an efficient solution can seldom be achieved by only considering the variables pairwise. Global constraints (2) Global constraints constitute abstractions of more complicated properties of problems and enables computations on a more detailed model Algorithms as constraint abstractions Often methods from operations analysis, matching theory or graph algorithms can be integrated into a constraint programming system as global constraints. This is an active and very promising research area in constraint programming{bel00}.
An example: Getting Started A toy problem Modeling Solving: propagation and search Send More Money (SMM) Find distinct digits for letters, such that SEND + MORE = MONEY Constraint Model for SMM Variables: S,E,N,D,M,O,R,Y e {0,,9} Constraints: distinct(S,E,N,D,M,O,R,Y) 1000S+100E+10N+D + 1000M+100O+10R+E = 10000M+1000O+100N+10E+Y S=0 M=0 Solution for SMM Find values for variables such that all constraints satisfied Finding a Solution Enumerate assignments: poor! Constraint programming compute with possible values prune inconsistent values constraint propagation search distribute: define search tree explore: explore for solution Some Concepts Constraint store Basic constraint Propagator Non-basic constraint Constraint propagation Constraint Store Stores basic constraints map variables to possible values Domains: finite sets, real intervals, trees,
x + 2y = z Propagators Amplify store by constraint propagation xe{3,4,5} ye{3,4,5} x>y y>3 Propagators Amplify store by constraint propagation xe{3,4,5} ye{4,5} x>y y>3 Propagators Amplify store by constraint propagation xe{3,4,5} ye{4,5} x>y y>3 Propagators Amplify store by constraint propagation xe{4,5} ye{4,5} x>y y>3 Propagators Amplify store by constraint propagation Disappear when entailed no more propagation possible xe{4,5} ye{4,5} x>y Constraint Space Store with connected propagators xe{4,5} ye{4,5} x>y y>3 Propagation for SMM Results in store S=9 Ee{4,,7} Ne{5,,8} De{2,,8} M=1 O=0 Re{2,,8} Ye{2,,8}
Propagation alone not sufficient! create simpler sub-problems distribution Distribution Yields spaces with additional constraints Enables further constraint propagation xe{4,5} ye{4,5} x>y y>3 xe{4} ye{4} x>y y>3 xe{5} ye{5} x>y y>3 x=4 x=4 Distribution Strategy Pick variable x with at least two values Pick value n from domain of x Distribute with x=n and x=n
Part of model Search Iterate propagation and distribution Orthogonal: distribution exploration Nodes: - Distributable - Failed - Succeeded SMM: Solution SEND + MORE = MONEY 9567 + 1085 = 10652 Heuristics for Distribution (CLP jargong: Labelling) Which variable? least possible values (first-fail) application dependent heuristic Which value? minimum, median, maximum x=m or x=m split with median m x<m or x>m In general: application specific SMM: Solution With First-fail SEND + MORE = MONEY 9567 + 1085 = 10652 Send Most Money (SMM++) Find distinct digits for letters, such that
and MONEY maximal SEND + MOST = MONEY Best Solution Search Nave approach: compute all solutions choose best Branch-and-bound approach: compute first solution add betterness constraint to open nodes next solution will be better prunes search space Also possible: restart strategy Branch-and-bound Search Find first solution Branch-and-bound Search Explore with additional constraint Branch-and-bound Search Explore with additional constraint Branch-and-bound Search Guarantees better solutions Branch-and-bound Search Guarantees better solutions Branch-and-bound Search Last solution best Branch-and-bound Search Proof of optimality Modelling SMM++ Constraints and distribution as before Order among solutions with constraints so-far-best solution S,E,N,D,M,O,T,Y current node S,E,N,D,M,O,T,Y constraint added 10000M+1000O+100N+10E+Y < 10000M+1000O+100N+10E+Y SMM++: Branch-and-bound SEND + MOST = MONEY 9782 + 1094 = 10876 SMM++: All Solution Search SEND + MOST = MONEY 9782 + 1094 = 10876 Summary Modeling variables with domain constraints to state relations distribution strategy solution ordering Solving constraint propagation constraint distribution search tree exploration The Art of Modeling Avoid search, avoid search, avoid Techniques increase propagation strength stronger propagators redundant propagators remove symmetrical solutions good distribution heuristics smart search engines Distribution Exploration Distribution defines shape of search tree
Exploration left-most depth-first interactive, graphical parallel branch-and-bound [prunes tree] Scheduling Modeling Propagation Global constraints Scheduling Among the examples of global reasoning that have successfully been introduced into constraint programming systems are a number of fundamental scheduling mechanisms. Scheduling A scheduling problem consists of a number of tasks with restrictions on start times, stop times and task duration. Often the tasks are partially ordered into totally ordered sequences. Such a totally ordered subset of tasks is often called a job. Scheduling Each task uses one or more resources during certain time intervals. The so called job shop scheduling problem is a classic and well studied case. Scheduling Resources can in general model widely different type of entities. For instance: 1. processing equipment in a production process. 2. staff or vehicles in a transport net. 3. network resources such as routers and transport links with limited capacity. Scheduling To arrange the tasks so that no limitations in resources are violated is called to schedule the tasks and it is in general a very difficult (NP-complete) computational problem. Nevertheless the many practical applications for methods in this area make it fairly well studied. Scheduling: Given Tasks duration resource Precedence constraints determine order among two tasks Resource constraints at most one task per resource [disjunctive, non-preemptive scheduling] Scheduling: Bridge Example Scheduling: Solution Start time for each task
All constraints satisfied
Earliest completion time minimal make-span Scheduling: Model Variable for start-time of task a start(a) Precedence constraint: a before b
start(a) + dur(a) s start(b) Propagating Precedence start(a)e{0,,7} start(b)e{0,,5}
a b a before b Propagating Precedence start(a)e{0,,7} start(b)e{0,,5}
a b a b a before b start(a)e{0,,2} start(b)e{3,,5}
Scheduling: Model Variable for start-time of task a start(a) Precedence constraint: a before b
start(a) + dur(a) s start(b) Resource constraint: a before b
or b before a Scheduling: Model Variable for start-time of task a start(a) Precedence constraint: a before b
start(a) + dur(a) s start(b) Resource constraint: start(a) + dur(a) s start(b)
or b before a
Scheduling: Model Variable for start-time of task a start(a) Precedence constraint: a before b
start(a) + dur(a) s start(b) Resource constraint: start(a) + dur(a) s start(b)
or start(b) + dur(b) s start(a) Reified Constraints Use control variable be{0,1} c b=1 Propagate c entailed propagate b=1 c entailed propagate b=0 b=1 entailed propagate c b=0 entailed propagate c not easy! Reification for Disjunction Reify each precedence [start(a) + dur(a) s start(b)] b 0 =1 and
[start(b) + dur(b) s start(a)] b 1 =1
Model disjunction b 0 + b 1 > 1
Model Is Too Nave Local view individual task pairs O(n 2 ) propagators for n tasks
Global view all tasks on resource single propagator smarter algorithms possible Edge Finding Find ordering among tasks (edges) For each subset of tasks {a}B assume: a before B deduce information for a and B assume: B before a deduce information for a and B join computed information can be done in O(n 2 ) Scheduling Architecture Constraint programming natural modeling specification model compiler Scheduling Architecture Constraint programming expressive modeling specification model compiler Summary Modeling easy but not always efficient constraint combinators (reification) global constraints smart heuristics
More on constraint-based scheduling Baptiste, Le Pape, Nuijten. Constraint-based Scheduling, Kluwer, 2001. Why Does CP Matter? Middleware for combining smart algorithmic components scheduling graphs flows
plus essential extra constraints Research in Constraints Propagation algorithms Search methods Innovative applications Programming and modeling languages
Hybrid methods linear programming local search Constraints in Sweden Swedish constraint network
SweConsNet [founded May 2002] http://www.dis.uu.se/~pierref/astra/SweConsNet/ CP Systems Commercial ILOG Solver C++ OPL Studio Modeling SICStus Prolog Prolog-based Eclipse Prolog-based Free GNU Prolog Prolog-based Mozart Oz CHOCO Claire Oz and Mozart Constraint-based programming system concurrent and distributed programming combinatorial problem solving and combinations: intelligent agents, Mozart implements Oz concurrent constraint programming language with: objects, functions, threads, Developed by Mozart Consortium Saarland University, Germany SICS/KTH, Sweden Universit catholique de Louvain, Belgium Mozart Fact Sheet Freely available at www.mozart-oz.org Many platforms supported Unix Windows Mac OS Active user community Comes with extensive documentation Many applications Constraints in Mozart Rich set of constraints finite domains scheduling finite sets records New propagators via C++ API Search and combinators [unique] programmable concurrency-compatible fully compositional Book: Schulte, Programming Constraint Services. LNAI, Springer 2002.g Some Research Issues Search methods Architecture and implementation Automatic selection of good propagator domain versus bound Challenging applications
Case Study Instruction scheduling Bus scheduling Instruction Scheduling Optimized object code by compiler Minimum length instruction schedule precedence latency resources per basic block
Best paper CP 2001, Peter van Beek and Kent Wilken, Fast Optimal Scheduling for Single-issue Processors with Arbitrary Latencies, 2001. Model All issue times must be distinct use single distinct constraint (as in SMM) is resource constraint or unit duration
Latency constraints precedence constraints (as before) difference: duration latency Making It Work Only propagate bounds information relevant for distinct
Add redundant constraints regions: additional structure in DAG successor and predecessor constraints [special case of edge-finding] Results Tested with gcc SPEC95 FP Large basic blocks up to 1000 instructions Optimally solved less than 0.6% compile time increase limited static improvement (< 0.1%) better dynamic impact (loops) Far better than ILP approach Off-Line Scheduling of Real- Time System System with global clock time-triggered real-time processes message exchange over shared bus Infinite, periodic schedule map to single fixed time window repeat
Klaus Schild, Jrg Wrtz. Scheduling of Time- Triggered Real-Time Systems, Constraints 5(4), 2000. Model Single resource: data bus Maximal latencies: messages valid for at most n time units Infinite schedule repeat finite schedule of given length repetition does not violate constraints Performance Problem size 6,000,000 time units 3500 processes and messages Model size up to 10 million constraints Run time from 10 min to 2 hrs (200 MHz PPro) Summary Useful for small components in software systems large offline optimization
Widely applicable in your area? hardware design? Conclusion Constraint programming useful easy modeling open to new techniques
Projects and Interests @ KTH Oz and Mozart Program analysis analysis of deep-guard ccp programs analysis of clp(FD) programs Constraint libraries: Gecode Oz and Mozart Some facts Concurrency and distribution Problem solving Oz and Mozart Constraint-based programming system concurrent and distributed programming combinatorial problem solving and combinations: intelligent agents,
People Seif Haridi seif@sics.se Christian Schulte schulte@imit.kth.se
plus many other people @ KTH/SICS Mozart Fact Sheet Mozart implements Oz concurrent constraint programming language with: objects, functions, threads, programmable search
Developed by Mozart Consortium Saarland University, Germany SICS/KTH, Sweden Universit catholique de Louvain, Belgium
Mozart Fact Sheet Freely available at www.mozart-oz.org Many platforms supported Unix Windows Mac OS Active user community Comes with extensive documentation Many applications Constraints for Concurrency Constraints describe data structures used for control [as opposed to Prolog] Logic variables as dataflow variables unconstrained suspension constrained resumption synchronization is automatic
Well established idea resumption condition is logical entailment [Maher,87], ccp [Saraswat,90] Constraints for Distribution Distribution presupposes concurrency hey, at least two threads Logic variables serve as communication channel provide latency tolerance: synchronization is automatic only if necessary support incremental message composition reception and processing make distribution orthogonal aspect Obtained by distribution protocols [Haridi et al., 99] Research in Distribution Distribution protocols for other entities in particular objects Fault tolerance Distributed simulation Peer-to-peer computing [EU Pepito] Bring protocols to distribution library Check: www.sics.se/dsl
Problem Solving Constraint domains tree constraints (records, feature) finite domains finite sets Programmable search and combinators based on computation spaces makes search compatible with concurrency new book: Christian Schulte, Programming Constraint Services LNAI 2302, Springer-Verlag, 2002 Combination Excellent choice for multi-agent systems!
Application to parallel search programmable search parallelism through distribution [Networked Personal Computers]
People Thomas Sjland sjoland@imit.kth.se Why Analysis of Hierarchical CCP? Concurrent programs matter important for distribution encapsulation by spaces mandatory
Provide global information compiler efficiency program transformation efficiency programmer understanding How To Do Analysis? Formulate abstract semantics Relate it to concrete semantics safeness termination accuracy Devise framework approach generic for abstract constraint domains in particular: abstract entailment Optimizing clp(FD) Programs Optimize clp(FD) programs using cheaper bounds propagation retaining same search space
People Christian Schulte schulte@imit.kth.se Peter J. Stuckey pjs@cs.mu.oz.au [University of Melbourne, Australia] Use Bound Propagation! Domain propagation good pruning high cost less pruning efficient
Use bound propagation when provable that search space the same
Approach Establish notions of equivalence set of constraints can be replaced common finite domain constraints considered
Analyse and optimize programs abstract interpretation of clp(FD) programs replace domain by bounds propagation if equivalent Status Paper: [PPDP,2001] First experiments show encouraging applicability good speedup
Current work apply at runtime better applicability